Pourquoi le resharper dit-il que la clause de capture avec une déclaration 'à lancer unique est redondante'?

StackOverflow https://stackoverflow.com/questions/1019237

Question

Je pensais que le lancement d'une exception est une bonne pratique. Laissez-la remonter dans l'interface utilisateur ou à un endroit où vous enregistrez l'exception et en avertissez l'utilisateur.

Pourquoi resharper dit-il qu'il est redondant?

try
{
    File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
    throw;
}
Était-ce utile?

La solution

Parce que

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch {
    throw;
}

n'est pas différent de

File.Open("FileNotFound.txt", FileMode.Open);

Si l'appel à File.Open (string, FileMode) échoue, alors, dans l'un ou l'autre des exemples, la même exception trouvera son chemin jusqu'à l'interface utilisateur.

Dans la clause catch ci-dessus, vous attrapez et relancez une exception sans rien faire d'autre, telle que la journalisation, l'annulation d'une transaction, l'encapsulation de l'exception pour y ajouter des informations supplémentaires, ou quoi que ce soit.

Cependant,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    GetLogger().LogException(ex);
    throw;
}

ne comportera aucun licenciement et ReSharper ne devrait pas se plaindre. De même,

try {
    File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
    throw new MyApplicationException(
        "I'm sorry, but your preferences file could not be found.", ex);
}

ne serait pas redondant.

Autres conseils

Parce que l'instruction ci-dessus a le même comportement que si elle n'y était pas. Identique à l'écriture:

File.Open("FileNotFound.txt", FileMode.Open);

Parce que le code de l'essai lance déjà l'exception.

Vous ne voudriez attraper et relancer l'exception que si vous voulez faire autre chose dans le bloc catch en plus de relancer l'exception.

Parce que c'est redondant.

Vous n'avez effectué aucun traitement dans le bloc catch, vous avez simplement levé l'exception à nouveau.

Cela vous avertit car il ne sert à rien d'essayer ... de bloquer le blocage là-bas.

De plus, un autre bon conseil est que "jeter ex". ne conservera pas la trace de la pile, mais "lancer". sera.

Il est à noter que pendant que ...

try
{
    DoSomething();
}
catch
{
    throw;
}

... est redondant, ce qui suit n'est pas ...

try
{
    DoSomething();
}
catch (Exception ex)
{
    // Generally a very bad idea!
    throw ex;
}

Ce deuxième extrait de code était répandu dans une base de code dont j'avais hérité il y a quelques projets et il a pour effet désagréable de masquer la trace de pile de l'exception d'origine. Lancer l'exception que vous venez de prendre de cette manière signifie que le haut de la trace de la pile se situe au niveau throw , sans mention de DoSomething ou de tout autre appel de méthode imbriqué réellement causé l'exception.

Bonne chance au code de débogage qui fait cela!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top