Warum sagt resharper ‚Catch-Klausel mit Single‚werfen‘Erklärung überflüssig ist‘?
-
06-07-2019 - |
Frage
dachte ich, eine Ausnahme zu werfen ist gute Praxis, es Blase wieder auf die Benutzeroberfläche oder irgendwo zu lassen, wo Sie die Ausnahme protokollieren und die Benutzer darüber informieren.
Warum resharper sagen, dass es überflüssig ist?
try
{
File.Open("FileNotFound.txt", FileMode.Open);
}
catch
{
throw;
}
Lösung
Da
try {
File.Open("FileNotFound.txt", FileMode.Open);
} catch {
throw;
}
ist nicht anders als
File.Open("FileNotFound.txt", FileMode.Open);
Wenn der Aufruf von File.Open(string, FileMode)
ausfällt, dann entweder Probe genau die gleiche Ausnahme wird seinen Weg bis zu der Benutzeroberfläche finden.
In dieser catch
Klausel oben, Sie sind einfach zu kontrollieren und wieder werfen eine Ausnahme, ohne etwas anderes zu tun, wie Logging, Walzen eine Transaktion zurück, die Ausnahme Einwickeln zusätzliche Informationen, um es hinzuzufügen, oder überhaupt etwas.
Allerdings
try {
File.Open("FileNotFound.txt", FileMode.Open);
} catch(Exception ex) {
GetLogger().LogException(ex);
throw;
}
würde keine Redundanzen enthalten und ReSharper sollte nicht beschweren. Ebenso
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);
}
wäre nicht überflüssig.
Andere Tipps
Da die obige Aussage hat das gleiche Verhalten wie wenn sie nicht da waren. Gleiche wie das Schreiben:
File.Open("FileNotFound.txt", FileMode.Open);
Da der Code im try bereits die Ausnahme zu werfen.
Sie möchte nur fangen und wieder werfen die Ausnahme, wenn Sie zusätzlich noch etwas anderes im catch-Block tun, um wieder werfen die Ausnahme werden.
Weil es überflüssig.
Sie haben eine Verarbeitung im catch-Block nicht getan, nur wieder die Ausnahme ausgelöst.
Es warnt Sie, weil es keinen Sinn hat, dass in versuchen ... catch-Block gibt.
Auch ist ein weiterer guter Tipp, dass "throw ex" wird nicht die Stack-Trace erhalten, sondern "werfen" wird.
Es ist erwähnenswert, dass während ...
try
{
DoSomething();
}
catch
{
throw;
}
... ist reduntant, die folgende ist nicht ...
try
{
DoSomething();
}
catch (Exception ex)
{
// Generally a very bad idea!
throw ex;
}
Der zweite Codeausschnitt war rife durch eine Code-Basis ich vor ein paar Projekten geerbt und es hat die unangenehme Wirkung der ursprünglichen Ausnahme der Stack-Trace versteckt. Wirft die Ausnahme, die Sie gerade auf diese Weise gefangen bedeutet, dass die Spitze des Stack-Trace auf der throw
Ebene ist, ohne Erwähnung von DoSomething
oder was auch immer verschachtelten Methodenaufrufen tatsächlich die Ausnahme verursacht hat.
Viel Glück Debugging-Code, der tut dies!