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.
2 votes
Mieux vaut faire au moins un printStackTrace() au lieu d'avoir un catch vide...
1 votes
Je pense qu'une trace de pile vous donne suffisamment d'informations pour repérer le bogue rapidement et facilement : le message d'erreur, la ligne problématique (y compris le numéro de ligne) et la "trace" que le programme a exécutée. Vous pouvez alors inspecter les logs avec une idée très claire de ce que vous recherchez.
14 votes
@willcodejavaforfood - c'est silencieux du point de vue de l'appelant. L'appelant n'a aucune idée que quelque chose s'est passé. Si c'est ce qui est prévu, c'est bien, mais en général, c'est une mauvaise nouvelle. De plus, pensez à ce qui se passe dans une applet : l'utilisateur ne verra jamais le résultat (sauf s'il a la console Java ouverte, ce qui n'arrive jamais). Ok, donc plus personne n'utilise d'applets ;) C'est la même chose pour servletm - l'utilisateur final ne sait pas que quelque chose s'est passé - c'est juste caché dans un journal.
1 votes
Je plaide coupable, votre honneur. (Bien que ce soit dans une base de code qui utilise ce, euh, modèle des milliers de fois déjà).
4 votes
Le lancement d'exceptions en Java est si répandu que la plupart des codeurs Java les ignorent parce que si vous faites le rattrapage correct des erreurs, vous devrez écrire beaucoup plus de code... donc, en fait, tous ces programmeurs Java font cela parce qu'ils sont paresseux.
2 votes
Lorsque je ne me soucie pas des exceptions, je place le corps de la méthode à l'intérieur d'un bloc try et je lance une AssertionError avec une chaîne expliquant pourquoi et/ou où cette erreur a été générée.
0 votes
N'avalez les exceptions qu'à l'endroit où la récupération se produit réellement.
1 votes
Pourquoi font-ils cela ? Parce qu'ils ne savent pas ce qu'ils font.