Je veux savoir, est-ce un code 2 strong>: Seul le code avec des chances d'exception en try block p> code 3 strong>: devrais-je attraper une exception toujours p> sur ceci (code1, code2 et code3) lequel est le meilleur? bonne pratique code> à placer code complet code> à l'intérieur d'un Essayez bloquer code> ou je devrais placer seulement Le code que je pense causera une exception spécifique code>?
Et devrais-je attraper une exception de base toujours
Je suis principalement préoccupé par la codage Java et C ++ P> P>
5 Réponses :
En règle générale, vous devriez ne prenez que des exceptions qui vous intéressent et que vous pouvez gérer forte>. C'est ... attraper une exception où vous pouvez faire quelque chose s.t. L'utilisateur ne percevait pas le problème ou lorsqu'il est explicitement nécessaire pour dire à l'utilisateur le problème. a dit cela, je suppose que lorsque vous écrivez "Code Paysement de OneException", vous savez comment gérer ONEEXception, mais pas exception, non? Alors alors ... seule gérer l'ONEEEXception. P>
Pour toutes les autres exceptions près, laissez-les apparaître avec tous leurs détails (StackTrace, etc.) que vous vous connectez évidemment. Remarque, évidemment, cela ne signifie pas que l'utilisateur doit également voir cette sortie d'exception, mais plutôt une erreur générique. P>
En ce qui concerne quel code placer où: le code avant la ligne qui pourrait jeter l'exception sera exécuté de toute façon, il n'a donc pas de sens de l'avoir à l'intérieur du bloc d'essai et avant em> le code qui jette. Code après que l'exception potentielle doit être placée entre essayer et seulement si cela dépend du code générateur d'exception. Donc, si votre appel de connexion de base de données peut échouer, placez toutes les requêtes de base de données à l'intérieur du bloc d'essai. P>
Limiter le "temps" passé dans un essai ... La capture facilite la lecture et la moins sujettes aux captures accidentelles. Je ne peux pas vous dire combien d'heures ont été perdues parce que quelqu'un a décidé d'attraper une exception qui aurait dû se propager. p>
Eh bien, je crois qu'il y a une exception à chaque règle. Disons que je donne une partie de mon code à quelqu'un d'autre et, dans ce code, j'aurais des statistiques. Ensuite, je voudrais que la statistique soit envoyée à moi, et je mettrais ce code entier à l'intérieur d'un essayer {} catch (exception e) {} code> parce que je ne voudrais pas que cela déclenche quoi que ce soit. Même si je n'obtiens rien, tout irait bien. Je suis d'accord que ce serait un cas tout à fait obscur, mais dites-moi si cela se tromperait toujours.
a) C'est une mauvaise pratique, de placer le code complet à l'intérieur d'un bloc d'essai. p>
b) Ne saisissez pas l'exception de base pour l'exhaustivité ou pour éviter plusieurs blocs de capture. Si vous souhaitez écrire dans un fichier, de nombreuses choses peuvent vous tromper: autorisation manquante, nom de fichier illégal, sans espace laissé sur le périphérique, .... Si vous présentez l'utilisateur, un message générique («Impossible d'écrire un fichier» + nom), il ne sait pas quoi faire. Soyez aussi précis que possible, et vous pouvez l'informer »seulement 20 Mo laissé sur le périphérique" + Devicename + "Nous avons besoin de 8 Mo supplémentaires (28 Mo au total); libérez-vous de l'espace et de répéter ou de choisir un autre appareil!") . Si vous attrapez une "exception", des chances sont élevées, que vous envisagez d'une exception, mais une autre se produit et n'est pas traitée correctement, car le bloc de capture n'était pas écrit avec cette possibilité. La meilleure chance de trouver cette exception est de le laisser apparaître, ou de le loger, si les journaux sont contrôlés régulièrement. p> li>
Cela peut être une différence entre développer une application, qui est simplement utilisée par les utilisateurs finaux ou en développant une API, utilisée par d'autres développeurs. Dans une API, vous souhaitez souvent envelopper une exception dans une exception propre, afin de faciliter la gestion des utilisateurs de votre API, et si vous avez un moyen uniforme de gérer des exceptions. Si votre code peut lancer de nombreuses exceptions et conduirait au code de client laid, où votre client devra spécifier une série d'exceptions encore et encore, vous enveloppez souvent les exceptions et retirez-les: P>
try {
...
}
catch {FileNotFoundException fnfe}
{
throw new MyApiException (fnfe);
}
catch {PermissionDeniedException pde}
{
throw new MyApiException (pde);
}
catch {IOException ioe}
{
throw new MyApiException (ioe);
}
Béni soit la nouvelle multi-capture à Java 7. Voir baptiste-wicht.com/2010/05/...
50% du Java-Folk n'a pas adopté la boucle simplifiée et vous parlez de Java-7? Peut-être que vous êtes un tel utilisateur de Scala d'adoption tôt, n'est-ce pas? ;)
Enveloppez le code au point où vous pouvez vraiment gérer l'exception et où vous pouvez gérer l'erreur. Si vous ne pouvez pas gérer l'erreur dans la fonction, ne faites pas d'envelopper le code dans le bloc Essayer / Catch.
Je ne sais pas pour Java, mais en C ++, vous devriez attraper en const Référence: P> < Pré> xxx pré> p>
C ++ n'est pas Java ou C # ou ... où vous avez besoin Ainsi, plutôt que de contempler le style de code que vous devez utiliser conjointement avec attraper code> (ou enfin code>) clauses à nettoyer après vous-même. En C ++, Raii A> Est-ce que ça. Par conséquent, je n'écris rarement jamais essayer code> / catch code> en C ++, au point où je le considère comme une odeur de code. p>
essayer code> / attraper code>, vous devez vous demander si vous avez besoin de ce essayez Code> / attrape code> du tout. p>
C n'a pas d'exception et il n'y a pas de langage appelé C / C ++, vous devez donc supprimer la balise
C code>.Les meilleures questions sont hors tension pour l'examen du code
Semble plus comme une question de dépassement de pile que la revue de code. Je voterais pour migrer, mais je n'ai pas assez de représentant.