216 votes

différence entre jeter et throw new Exception()

Quelle est la différence entre

et

Peu importe que la seconde affiche un message ?

353voto

SLaks Points 391154

throw; renvoie l'exception d'origine et conserve son origine trace de la pile.

throw ex; jette l'exception d'origine mais réinitialise la trace de la pile, en détruisant toutes les informations de trace de pile jusqu'à ce que votre catch bloc.


Ne JAMAIS écrire throw ex;


throw new Exception(ex.Message); est encore pire. Il crée une nouvelle marque d' Exception exemple, la perte de l'original trace de la pile de l'exception, ainsi que son type. (par exemple, IOException).
En outre, certaines exceptions contenir des informations supplémentaires (par exemple, ArgumentException.ParamName).
throw new Exception(ex.Message); va détruire cette information.

Dans certains cas, vous pouvez encapsuler toutes les exceptions personnalisé dans un objet d'exception, de sorte que vous pouvez fournir des informations supplémentaires à propos de ce que le code a été fait au moment où l'exception a été levée.

Pour ce faire, définir une nouvelle classe qui hérite Exception, ajouter tous les quatre exception des constructeurs, et éventuellement un supplément de constructeur qui prend un InnerException ainsi que des informations supplémentaires, et de jeter votre nouvelle classe d'exception, en passant ex le InnerException paramètre. En passant l'originale InnerException, vous conservez l'ensemble de l'exception d'origine de propriétés, y compris la trace de la pile.

46voto

Mark Byers Points 318575

La première conserve l'original de la stacktrace:

try { ... }
catch
{
    // Do something.
    throw;
}

La seconde vous permet de changer le type de l'exception et/ou le message et d'autres données:

try { ... } catch (Exception e)
{
    throw new BarException("Something broke!");
}

Il y a aussi une troisième voie, où l'on passe d'un intérieur d'exception:

try { ... }
catch (FooException e) {
    throw new BarException("foo", e);
} 

Je vous recommande d'utiliser:

  • la première, si vous voulez faire un peu de ménage en situation d'erreur sans détruire de l'information ou ajouter des informations sur l'erreur.
  • la troisième si vous souhaitez ajouter plus d'informations sur l'erreur.
  • la deuxième, si vous voulez cacher des informations (à partir de utilisateurs non approuvés).

10voto

Justin Niessner Points 144953

Lever une nouvelle Exception balaie la trace de la pile actuelle.

``conserve la trace de la pile originale et est presque toujours plus utile. L’exception à cette règle est lorsque vous souhaitez encapsuler l’Exception dans une Exception personnalisée de votre choix. Vous devez ensuite faire :

4voto

Mark Rushakoff Points 97350

lève de nouveau l’exception interceptée, conservant la trace de la pile, tandis que perd certains détails de l’exception interceptée.

Vous utiliseriez normalement `` en soi pour enregistrer une exception sans la gérer pleinement à ce moment-là.

BlackWasp a un bon article intitulé suffisamment Levée d’Exceptions dans c#.

3voto

Robert Harvey Points 103562

``est de nouveau une exception interceptée. Cela peut être utile si vous voulez faire quelque chose avec l’exception avant de le passer vers le haut de la chaîne d’appels.

À l’aide de `` sans aucun argument préserve la pile des appels pour des fins de débogage.

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