web-dev-qa-db-fra.com

Utiliser catch sans arguments

Quelle est la différence entre:

catch
{
    MessageBox.Show("Error.");
}

et:

catch (Exception ex)
{
    MessageBox.Show("Error.");
    //we never use ex, so is it better to use catch without arguments?
}
51
petko_stankoski

Depuis .NET 2, si vous ne modifiez pas la configuration? Rien.

Avant cela, ou avec une configuration Tweak dont je ne me souviens pas précisément, il était possible qu'une exception soit levée à partir de code non managé qui n'a pas converti en un Exception- compatible objet.

Notez qu'il existe une autre option entre les deux, où vous spécifiez le type mais pas de variable:

catch (Exception)
{
   ...
}

Personnellement, je serais très méfiant d'attraper une exception sans même journalisation elle. Il peut être nécessaire si vous appelez une API à tête d'os, mais il est généralement préférable de l'éviter.

66
Jon Skeet

Je pense que ce sont les mêmes. Mais le deuxième cas a déclenché un avertissement du compilateur car vous déclarez une exception que vous n'avez pas utilisée. J'aime plutôt le premier parce que vous dites explicitement que vous n'utilisez pas l'exception. Il y en a aussi un troisième

catch (Exception)
{
    //do something
}

si vous souhaitez spécifier le type d'exception mais ne vous souciez pas de l'exception elle-même.

8
Iesvs

En règle générale, vous devez d'abord détecter des erreurs spécifiques.

Mais si vous optez pour une capture générale Exception comme vous le feriez, je dirais d'utiliser le deuxième cas:

catch (Exception ex)
{
     MessageBox.Show("Error.");
     //we never use ex, so is it better to use catch without arguments?
}

cela peut vous aider avec le débogage car la variable contient la trace de la pile, le message d'exception ... etc. Que vous pouvez utiliser pour enregistrer l'erreur ou quelque chose qui vous aidera à la prévenir.

Soyez très prudent en utilisant cette approche, cependant:

MessageBox.Show("Error.");

Ne pas garder trace de vos erreurs quelque part (comme un fichier journal) peut causer un très gros gâchis.

6
TheBoyan

Dans votre deuxième exemple, vous pouvez référencer des données d'exception, comme la trace de pile, la source, etc. Cela donne également un message général qui est parfois utile. Il vous indique POURQUOI vous avez subi une exception qui est importante lors du débogage.

3
jlafay

Une exception ne peut pas être interceptée catch(Exception).

Ci-dessous excecption en mono sur linux, devrait intercepter sans paramètre.

Sinon, le runtime ignorera la déclaration catch(Exception).

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.

Si vous rencontrez ce problème, essayez de supprimer le paramètre de l'instruction catch, connectez les variables de contexte pour trouver la cause de l'erreur.

P.S. Je ne sais pas comment sur Windows, le programme exécuté sous Windows est normal.

0
IlPADlI