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;
}
War es hilfreich?

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!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top