Dupliquer possible:
différence entre lancer et lancer nouvelle Exception ()Quel serait le point d'avoir juste
catch (Exception) { throw; }
Qu'est-ce que cela fait?
Réponses
Trop de publicités?Par lui-même, l' throw
mot-clé il suffit de le re-soulève l'exception interceptée par l' catch
énoncé ci-dessus. Ceci est pratique si vous voulez faire un peu rudimentaire gestion de l'exception (peut-être une compensation de l'action comme de l'annulation d'une transaction) et ensuite renvoyer l'exception à la méthode appelante.
Cette méthode a un avantage significatif par rapport à la capture de l'exception dans une variable et de lancer de cette instance: Il conserve l'original de la pile d'appel. Si vous catch (Exception ex) et ensuite jeter ex, votre pile d'appel ne commencera à l'instruction throw et vous perdez de la méthode/de la ligne de l'erreur d'origine.
Parfois, vous voudrez peut-être faire quelque chose comme ceci:
try
{
// do some stuff that could cause SomeCustomException to happen, as
// well as other exceptions
}
catch (SomeCustomException)
{
// this is here so we don't double wrap the exception
throw;
}
catch (Exception e)
{
throw new SomeCustomException("An error occurred saving the widget", e);
}
Il renvoie exactement la même erreur, vous ne gagnez rien.
Parfois, vous pouvez utiliser la méthode catch pour effectuer une journalisation ou autre chose sans interrompre votre exception de la manière suivante:
catch (Exception) {
myLogger.Log(LogLevels.Exception, "oh noes!")
throw;
}
J'ai d'abord pensé à tort que cela détendrait votre pile, mais ce ne serait le cas que si vous procédiez comme suit:
catch (Exception err) {
throw err;
}