31 votes

Un essai / capture vide est-il égal à une exception de capture?

 try {
}
catch (Exception) {
}
 

puis-je simplement écrire

 try {
}
catch {
}
 

Est-ce correct dans C # .NET 3.5. Le code est plus joli mais je ne sais pas si c'est pareil.

31voto

Rei Miyasaka Points 3359

Ils sont pas les mêmes.

catch (Exception) { } attraper des exceptions gérées uniquement; catch { } attraper des non-CLS des exceptions ainsi: http://msdn.microsoft.com/en-gb/bb264489.aspx

Une non prise en charge non compatibles CLS exception devient un problème de sécurité quand déjà permis les autorisations sont supprimés dans le bloc catch. Parce que non-CLS conforme exceptions ne sont pas pris, un méchant de la méthode qui jette une non-CLS conforme à l'exception de courir avec élévation de la les autorisations.

Edit: en fait .NET 2.0+ encapsule les valeurs, de sorte qu'ils sont les mêmes. C'est un peu un soulagement!

13voto

Justin Ethier Points 57486

Oui, l'avantage du premier formulaire est que vous pouvez nommer la variable d'exception puis utiliser l'objet pour enregistrer les détails de l'exception dans un fichier, etc.

 try {
}
catch (Exception ex) {
  // Log exception message here...
}
 

En outre, il est généralement déconseillé d'attraper la classe générique Exception si vous pouvez plutôt intercepter des exceptions spécifiques (telles qu'une exception IOException) à l'aide du premier formulaire.

13voto

Travis Heseman Points 4646

Edit: Comme C# 2.0, non-conformes CLS des exceptions peuvent être pris dans les deux sens.

Donc, oui. Ils sont identiques. Un paramètre clause catch sans une déclaration de Type de captures de toutes les Exceptions.

Dans le CLR 2.0, MS introduit RuntimeWrappedException, ce qui est conforme CLS type d'exception, pour encapsuler non-conformes CLS exceptions. Le compilateur C# ne vous permettra pas de les jeter, mais il peut les attraper avec le catch (Exception) { } syntaxe.

C'est pourquoi le compilateur C# va émettre un avertissement CS1058 si vous utilisez les deux clauses dans le même temps sur CLR 2.0 ou version ultérieure.

Ainsi, ils sont en fait identiques.

1voto

Peter Points 9636

C'est la même chose, mais si vous mettez un e après Exception dans votre premier exemple, vous savez quelle exception a été levée ...

edit: vous ne devriez jamais attraper d'exception, comment savez-vous comment le gérer correctement?

1voto

satyajit Points 313

Je suppose que si vous ne souhaitez pas utiliser l'exception d'une manière ou d'une autre, la seconde est parfaitement adaptée. mais pour utiliser l'exception dans la première, vous devez déclarer une variable comme celle-ci

 try {
}
catch (Exception e) {
//do something with e
}
 

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