Plusieurs try-catch ou un seul?

Normalement, je ferais ceci:

try
{
    code

    code that might throw an anticipated exception you want to handle

    code

    code that might throw an anticipated exception you want to handle

    code
}
catch 
{

}

Y a-t-il des avantages à le faire de cette façon?

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

try
{
    code that might throw an anticipated exception you want to handle
}
catch
{
}

code

mise à Jour:

J'ai initialement posé cette question avec référence à C#, mais comme A. Levy l'a commenté, cela pourrait s'appliquer à n'importe quel langage de gestion des exceptions, donc j'ai fait en sorte que les balises Le reflètent.

44
demandé sur Steve 2010-07-13 21:46:29

11 réponses

Ça dépend. Si vous souhaitez fournir une gestion spéciale pour des erreurs spécifiques, utilisez plusieurs blocs catch:

try
{ 
    // code that throws an exception
    // this line won't execute
}
catch (StackOverflowException ex)
{
    // special handling for StackOverflowException 
}
catch (Exception ex)
{
   // all others
}

Si, cependant, l'intention est de gérer une exception et de continuer à s'exécuter, placez le code dans des blocs try-catch distincts:

try
{ 
    // code that throws an exception

}
catch (Exception ex)
{
   // handle
}

try
{ 
    // this code will execute unless the previous catch block 
    // throws an exception (re-throw or new exception) 
}
catch (Exception ex)
{
   // handle
}
51
répondu Jamie Ide 2017-09-21 19:03:13

Non plus, utilisez simplement plusieurs blocs de capture pour des exceptions spécifiques (à moins qu'il n'y ait juste une tonne de code dans le bloc et que seulement quelques lignes puissent lancer un exception.In ce cas, je voudrais aller avec la deuxième méthode).

10
répondu Ed S. 2010-07-13 17:50:00

Si je pouvais choisir la seconde, je séparerais probablement cela en deux fonctions.

9
répondu Darin Dimitrov 2010-07-13 17:50:49

Vous pensez à ce sujet de la mauvaise façon. Que devez - vous faire dans vos blocs de capture? Si vous Récupérez à partir de l'une des exceptions possibles en exécutant le même code, quelle que soit l'opération qui a lancé l'exception, utilisez un bloc catch. Si vous devez effectuer différentes opérations de nettoyage en fonction de l'opération lancée, utilisez plusieurs blocs de capture.

Aussi, si vous pouvez utiliser try / finally ou le modèle RAII au lieu de try/catch, alors vous devriez.

4
répondu zwol 2010-07-13 18:12:18

La deuxième méthode est meilleure à mon avis car elle vous permet de piéger les erreurs avec plus de précision.

Envelopper également votre code entier dans un gros bloc try / catch est mauvais, si votre application a une sorte de problème et qu'elle se bloque, mais puisque vous avez piégé une grande execption Générique, les chances que vous puissiez réellement le gérer correctement sont plus faibles. Vous devriez avoir des parties spesfic à l'intérieur d'essayer catch, comme si vous lisez un fichier ou prenez l'entrée de l'utilisateur. De cette façon, vous pouvez mieux gérer cette exeception

3
répondu EKS 2010-07-13 17:48:34

Je préfère la deuxième méthode-elle facilite le débogage, la gestion des erreurs plus précise et alimente également bien vos tests unitaires.

2
répondu Andy 2010-07-13 17:51:47

J'irais pour la 2ème option, mais chaque fois que je vois ce modèle de code, mon premier sentiment est de penser à le diviser en plusieurs fonctions / méthodes. Évidemment, le fait de le faire dépend de ce que fait le code;)

2
répondu barrylloyd 2010-07-13 17:55:40

Cela dépend de la nature du type d'erreurs qui se produisent dans votre code.

  1. Si la gestion de ces erreurs que vous allez faire est la même chose pour un seul essai ... catch pour ce groupe de code. Sinon, il sera trop fastidieux.

  2. Si les erreurs ont nécessité une manipulation différente, séparez-le parce que vous devez le faire.

N'APPLIQUEZ PAS UNE SEULE MÉTHODE POUR TOUS LES CAS. LA PROGRAMMATION LA PLUPART DU TEMPS EST SPÉCIFIQUE AU CONTEXTE:)

Vous devez atteindre un équilibre de "Bon / complexe" et "mauvais / SIMPLE". Plus vous codez, vous serez moins coincé dans ce genre de dilemme:)

Bonne programmation!

2
répondu ttchong 2010-07-13 17:57:01

Deuxième méthode. Garder le code qui pourrait lancer une exception séparée des autres codes-maintient la section Plus petite et plus facile à gérer au lieu d'envelopper tout le code, même celui qui ne lancera pas d'exceptions.

1
répondu Mark Schultheiss 2010-07-13 17:52:02

2ème façon mais idéalement utiliser des gardes de code-try / catch est coûteux

0
répondu CarneyCode 2010-07-13 17:49:47

Il y a du temps que nous voulons montrer une erreur spécifique à l'utilisateur.

try{

   try{
      ... send message
   }
   catch(exception e){
    ...log error
    ...rethrow  send related error/show custom error

   }
     try{
  ...try to receive response
    }
      catch(exception e){
       ...show receive related error
       }
      //finally close the connection
      }finally{
        ...close connection
        }
0
répondu Ashburn RK 2018-03-26 15:46:37