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.
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
}
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).
Si je pouvais choisir la seconde, je séparerais probablement cela en deux fonctions.
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.
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
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.
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;)
Cela dépend de la nature du type d'erreurs qui se produisent dans votre code.
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.
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!
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.
2ème façon mais idéalement utiliser des gardes de code-try / catch est coûteux
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
}