196 votes

Pourquoi essayer {...} enfin {...} bien; essayez {...} attraper {} mal?

J'ai vu des gens dire que c'est mauvais d'utiliser des captures sans arguments, surtout si le catch n'est pas faire n'importe quoi:

StreamReader reader=new  StreamReader("myfile.txt");
try
{
  int i = 5 / 0;
}
catch   // No args, so it will catch any exception
{}
reader.Close();

Cependant, cela est considéré comme une bonne forme:

StreamReader reader=new  StreamReader("myfile.txt");
try
{
  int i = 5 / 0;
}
finally   // Will execute despite any exception
{
  reader.Close();
}

Aussi loin que je peux dire, la seule différence entre mettre de nettoyage de code dans un bloc finally et de mettre le code de nettoyage après le try..catch est si vous avez des retour des déclarations dans votre bloc try (dans ce cas, le code de nettoyage à enfin s'exécuter, mais le code après le try..catch ne sera pas).

Sinon, quel est si spécial à propos de finalement?

354voto

Khoth Points 7001

La grande différence est que try...catch avalera l'exception, cachant le fait qu'une erreur s'est produite. try..finally exécutera votre code de nettoyage, puis l'exception continuera à être gérée par quelque chose qui sait quoi en faire.

60voto

Adam Wright Points 31715

"Enfin" est une déclaration de "quelque Chose que vous devez toujours faire pour s'assurer que le programme de l'état est sain d'esprit". En tant que tel, il est toujours bon d'en avoir un, si il n'y a aucune possibilité que des exceptions peuvent jeter hors du programme de l'état. Le compilateur va également de grands efforts pour s'assurer que votre Enfin le code est exécuté.

"Catch" est une déclaration de "je peux le récupérer à partir de cette exception". Vous ne devez récupérer d'exceptions, vous pouvez vraiment correct - catch sans arguments, dit "Hé, je peux le récupérer à partir de rien!", ce qui est presque toujours faux.

Si il était possible de récupérer à partir de chaque exception, alors il faudrait vraiment être d'une sémantique de chipoter, sur ce que vous allez déclarer votre intention d'être. Cependant, il n'est pas, et presque certainement les cadres au-dessus du vôtre sera mieux équipé pour gérer certaines exceptions. En tant que tel, l'utilisation enfin, obtenir votre code de nettoyage exécuter gratuitement, mais laisse encore plus de connaissance des gestionnaires d'aborder la question.

32voto

chakrit Points 29562

Parce que quand une seule ligne, déclenche une exception, que vous ne savez pas.

Avec le premier bloc de code, à l'exception aurez simplement à être absorbé, le programme continue de s'exécuter, même lorsque l'état du programme peut être faux.

Avec le deuxième bloc, l'exception sera levée et les bulles mais l' reader.Close() est toujours garanti.

Si une exception n'est pas prévu, alors ne mettez pas un bloc try..catch, ça va être difficile à déboguer plus tard, lorsque le programme est entré en mauvais état et que vous n'avez pas une idée de la raison.

21voto

Mark Ingram Points 24995

Enfin est exécuté n'importe quoi. Donc, si votre bloc d'essai a été un succès, il va exécuter, si votre bloc try échoue, il va ensuite exécuter le bloc catch, et le bloc finally.

Aussi, il est préférable d'essayer d'utiliser la suite de construire:

using (StreamReader reader=new  StreamReader("myfile.txt"))
{
}

Comme l'utilisation de déclaration est automatiquement enveloppé dans un try / finally et le flux sera automatiquement fermé. (Vous aurez besoin de mettre un try / catch autour de l'instruction à l'aide si vous voulez à réellement attraper l'exception).

5voto

Chris Lawlor Points 10033

Je suis d'accord avec ce qui semble être un consensus là - vide "attraper" est mauvais, car il masque quelle que soit l'exception qui pourrait avoir eu lieu dans le bloc try.

Aussi, à partir d'un point de vue de la lisibilité, quand je vois un "d'essayer" bloc je suppose que il y aura un "attraper" l'instruction. Si vous êtes seulement en utilisant un 'essai', afin de s'assurer que les ressources sont allouées dans le "enfin" le bloc, vous pourriez envisager de l' 'a l'aide d'une déclaration à la place:

using (StreamReader reader = new StreamReader('myfile.txt'))
{
    // do stuff here
} // reader.dispose() is called automatically

Vous pouvez utiliser le 'l'aide de l'énoncé avec un objet qui implémente IDisposable. L'objet de la méthode dispose() est appelée automatiquement à la fin du bloc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X