Quelle est la différence entre
et
Peu importe que la seconde affiche un message ?
Quelle est la différence entre
et
Peu importe que la seconde affiche un message ?
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.
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.
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:
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#.
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.