84 votes

Pourquoi les utilisateurs de Java consomment-ils souvent les exceptions de manière silencieuse ?

Je n'ai jamais fait de codage Java sérieux auparavant, mais j'ai appris la syntaxe, les bibliothèques et les concepts sur la base de mes compétences existantes (Delphi et C#). Une chose que j'ai du mal à comprendre est que j'ai vu tellement de code qui consomme silencieusement des exceptions après que printStackTrace así:

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

Il existe un code similaire à celui-ci dans presque tous les articles et projets Java que j'ai rencontrés. D'après mes connaissances, c'est très mauvais. L'exception devrait presque toujours être transmise au contexte extérieur comme ceci :

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            e.printStackTrace();
            throw new AssertionError(e);
        }
    }

La plupart du temps, l'exception devrait être traitée au niveau de la boucle la plus extérieure qui appartient au cadre sous-jacent (Java Swing par exemple). Pourquoi est-ce que cela semble être la norme de coder de la sorte dans le monde Java ? Je suis perplexe.

D'après mon expérience, je préférerais supprimer printStackTrace entièrement . Je voudrais simplement le relancer comme un aka non géré. RuntimeException (ou, encore mieux, AssertionError ), puis l'attrape et l'enregistre à l'endroit le plus approprié : la boucle la plus extérieure du cadre.

    public void process() {
        try {
            System.out.println("test");
        } catch(Exception e) {
            throw new AssertionError(e);
        }
    }

59 votes

Je dirais que ce n'est pas vraiment silencieux lorsque la trace de la pile est imprimée :)

14 votes

Je me permets de citer Isaac Waller : "Mais votre programme n'abandonne pas et continue, très probablement dans un état indéfini".

16 votes

@willcodejavaforfood, Votre commentaire a obtenu tant de votes et cela me laisse encore plus perplexe sur l'état d'esprit typique de la Java.

208voto

OscarRyz Points 82553

J'ai toujours pensé que c'est similaire à le scénario suivant:

"Un homme se fait tirer dessus.

Il retient son souffle et a assez de force pour prendre un bus.

10 km plus tard, l'homme descend du bus, des promenades à un couple de blocs et de mourir."

Lorsque la police a obtenir pour le corps, ils n'ont pas la moindre idée de ce qui s'était passé. Ils peuvent avoir, par la suite mais il est beaucoup plus difficile.

Est-ce mieux:

"Un homme se fait tirer dessus, et le meurt instantanément et le corps fixe exactement où le meurtre avait juste arrivé"

Lorsque la police arrive, toutes les preuves sont en place.

Si un système est à l'échec, mieux vaut échouer rapidement

Abordant la question:

  1. De l'Ignorance.
    • +
  2. La paresse

EDIT:

Bien sûr, la section catch est utile.

Si quelque chose peut être fait avec l'exception, c'est là où il devrait être fait.

Probablement ce n'est PAS une exception pour le code, c'est probablement quelque chose qui est attendue ( et dans mon analogie, c'est comme une veste pare-balles, et l'homme a été en attente pour la prise de vue à la première place ).

Et oui, la pêche pourrait être utilisé pour Lancer des exceptions appropriées à l'abstraction

2 votes

Avaler des exceptions n'est pas un échec, et encore moins un échec rapide. D'un autre côté, si le contrat de votre méthode a un paramètre qui est une chaîne de chiffres et que vous l'analysez en un Integer, vous pouvez avaler l'exception ParseException. Si vous écrivez une fonctionnalité spécifique, définissez une exception personnalisée pour l'échec de cette fonctionnalité, puis attrapez les exceptions et lancez votre exception personnalisée (avec l'exception originale comme argument). Elle peut alors échouer rapidement à un endroit où un comportement significatif peut se produire (affichage à l'utilisateur, envoi d'un courrier électronique, journal, abandon de ce fil de serveur, etc.)

23 votes

Attendez une minute... Je dois d'abord arrêter de rire... Ok... C'est de loin la réponse la plus amusante à une question que j'ai vue jusqu'à présent. Elle a bien fait passer le message. Bien qu'il puisse être très utile de transmettre l'exception "en haut de la chaîne" pour qu'elle soit traitée, il vaut mieux au moins attraper l'exception d'abord et la transmettre ensuite pour que des informations utiles puissent être incluses.

0 votes

L'exception n'est pas l'erreur. L'exception, c'est l'homme qui se fait tirer dessus, puis qui détaille l'incident dans une note qu'il attache à un pigeon voyageur entraîné à voler vers la brigade criminelle la plus proche.

33voto

Kris Points 8813

Cela est généralement dû au fait que l'EDI propose une solution rapide qui intègre le code incriminé dans un bloc try-catch avec la gestion de cette exception. L'idée est que vous faites réellement quelque chose, mais pas les développeurs paresseux.

C'est une mauvaise forme, sans doute.

2 votes

Je suis d'accord, l'exemple donné ressemble à la correction rapide par défaut d'Eclipse, avec le commentaire // FIXME : supprimé.

2 votes

Eh bien, vous avez dit "C'est de mauvais goût", aucun doute "et je suis d'accord à 100%. Cependant, certaines autres réponses et commentaires me rendent très curieux de la philosophie qui se cache derrière cette très grande partie (je crois) des développeurs java.

4 votes

J'aimerais vraiment qu'Eclipse fasse quelque chose de radical à ce niveau. Par exemple, e.printStackTrace() ; System.exit(1) ;

22voto

Bill the Lizard Points 147311

C'est un classique argument de paille . printStackTrace() est une aide au débogage. Si vous l'avez vu sur un blog ou dans un magazine, c'est parce que l'auteur était plus intéressé par l'illustration d'un point de vue autre que la gestion des exceptions. Si vous l'avez vu dans du code de production, le développeur de ce code était ignorant ou paresseux, rien de plus. Cela ne devrait pas être considéré comme un exemple de pratique courante dans le "monde Java".

1 votes

Je n'ai pas de problème à écrire du mauvais code dans un blog ou un magazine, mais pas en production ? je préfère écrire du mauvais code en production. si un gars vraiment intelligent utilise printStackTrace, il convainc les gens de l'utiliser. je comprends que le code d'exception est plus long de 8 caractères, mais ...

8 votes

@ABCDE : Je ne suis pas du tout d'accord. Vous préférez écrire du mauvais code en production ? C'est du code qui est censé fonctionner ! Les articles de blog et de magazine sont censés illustrer un point. Si la gestion des erreurs n'est pas le point, alors elle peut être juste un encombrement. Beaucoup d'auteurs utilisent une gestion des erreurs très simplifiée, voire aucune, dans leurs articles. Ce n'est pas un exemple à suivre.

19voto

AgileJon Points 20497
  1. Java vous oblige à traiter toutes les exceptions de manière explicite. Si une méthode que votre code appelle est déclarée comme pouvant lever une FooException et une BarException, votre code MUST gérer (ou lancer) ces exceptions. La seule exception à cette règle est RuntimeException qui est silencieux comme un ninja.
  2. Beaucoup de programmeurs sont paresseux (moi y compris), et il est très facile d'imprimer simplement la trace de la pile.

7 votes

Mais votre programme ne s'arrête pas et continue, très probablement dans un état indéfini.

2 votes

L'application ne se bloquera pas si l'exception est correctement gérée au niveau de la sortie.

2 votes

Au moins la moitié des exceptions sont des "RuntimeExceptions", vous donnez l'impression qu'il n'y en a qu'une. Et elle n'est pas silencieuse, et une RutimeException non attrapée imprimera une trace de pile et fera planter votre programme.

12voto

dfa Points 54490

Parce que Exceptions vérifiées est une expérience ratée

(peut-être que printStackTrace() est le vrai problème ? :)

0 votes

Pourquoi RuntimeException n'est-il pas le bon choix ?

0 votes

Une grande partie des bibliothèques standard de Java utilisent des exceptions contrôlées, ce qui vous oblige à les utiliser fréquemment.

0 votes

Oui, parce que nous voulons vraiment que les personnes qui écrivent des JDBC à la main (ce qui, lorsqu'ils sont écrits eux-mêmes au lieu d'utiliser un framework, est déjà assez mauvais) ne soient pas conscientes et obligées d'attraper toutes les SQLExceptions possibles qui peuvent se produire..... /s

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X