7
votes

Code complet en try / attraper bloc

Je veux savoir, est-ce un bonne pratique à placer code complet à l'intérieur d'un Essayez bloquer ou je devrais placer seulement Le code que je pense causera une exception spécifique ?
Et devrais-je attraper une exception de base toujours

code 1 : Code complet dans Essayez Block xxx

code 2 : Seul le code avec des chances d'exception en try block xxx

code 3 : devrais-je attraper une exception toujours xxx

sur ceci (code1, code2 et code3) lequel est le meilleur?
Je suis principalement préoccupé par la codage Java et C ++


3 commentaires

C n'a pas d'exception et il n'y a pas de langage appelé C / C ++, vous devez donc supprimer la balise C .


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.


5 Réponses :


5
votes

En règle générale, vous devriez ne prenez que des exceptions qui vous intéressent et que vous pouvez gérer . 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.
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.

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.


0 commentaires

3
votes

attrape toujours exactement ce que vous devez et plus. Peu importe combien nous essayons, nous ne pouvons pas rendre notre code complètement "preuve idiote". Si quelqu'un vous transmet quelque chose qui causera une erreur aléatoire, c'est leur travail de le gérer. Si notre code gère l'exception de quelqu'un d'autre qui a beaucoup trop de risque d'être un effet secondaire inattendu.

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 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.

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.


1 commentaires

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) {} 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.



1
votes
  • a) C'est une mauvaise pratique, de placer le code complet à l'intérieur d'un bloc d'essai. p>

    • A1) à côté des exceptions attrapantes, un bloc d'essai est une documentation dans laquelle une exception pourrait se produire. Alors placez-le près de la cause, vous avez à l'esprit. Li>
    • A2) Dans de mauvaises circonstances, vous avez un fichier à lire et ajouter plus tard un pour écrire, mais votre exception (FilenotfoundException) n'a été écrite qu'avec le premier à l'esprit. Une portée maigre autour des lieux problématiques vous aidera à identifier d'autres problèmes. li> ul> li>
    • 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);
      }
      

2 commentaires

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? ;)



1
votes

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: < Pré> xxx


0 commentaires