webentwicklung-frage-antwort-db.com.de

Rückkehr in Fangblock?

Ist es falsch, eine return-Anweisung in einem catch-Block zu haben? Welche Alternativen gibt es?

public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        return false;
    }

}
53
lowlyintern

Sie können normalerweise vom catch-Block zurückkehren .. _. Normalerweise ist es ein guter Funktionscode.

35
Svisstack

Eine Alternative wäre, den Rückgabewert in einer temporären Variablen zu speichern:

public bool SomeFunction()
{
    bool success = true;
    try
    {
        //somecode
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
        success = false;
    }

    return success;
}

Aber persönlich finde ich die Art, wie Sie es geschrieben haben (mit einer catch-all catch-Anweisung), lesbarer. Auf der anderen Seite, wenn Sie eine bestimmte Ausnahme erwarten und möglicherweise mehrere Pfade haben, um den Erfolg zurückzugeben oder nicht ...

try
{
    DoTheImportantThing();
    DoTheOtherThingThatMightFailButWeDontCare();
}
catch (DontCareAboutItException ex)
{
    log.Info(ex);
}
catch (Exception ex)
{
    log.Error(ex);
    return false;
}

return true;

Dann sind Sie meiner Meinung nach am besten dran, die Rückmeldungen so nahe wie möglich am Ende zu halten.

Als Randbemerkung sollten Sie je nach Anwendung protokollieren, welche Ausnahmen Sie abfangen, anstatt sie dem Benutzer anzuzeigen. Protokollierte Ausnahmen sind viel zuverlässiger als die Berichte des Benutzers über das Geschehene.

19
Mark Rushakoff

Wenn es im try-Block bereits eine return-Anweisung gibt, würde ich wahrscheinlich die andere return am Ende der Funktion setzen:

try
{
    //somecode
    return true;
}
catch(Exception ex)
{
    MessageBox.Show(ex.message);
}
return false;

Und dies, um Mehrfachrückgaben zu vermeiden, wenn mehrere Ausnahmen behandelt werden müssen.

9
Darin Dimitrov

Es ist in Ordnung, man denke nur daran, dass ein Code nach der Anweisung return ausgeführt werden kann (der Rückgabewert wird eingelöst).

    try
    {
        return;
    }
    catch(Exception ex)
    {
        return;
    }
    finally
    {
        //some code
    }
8
Andrew
public bool SomeFunction()
{
    try
    {
        //somecode
        return true;
    }
    catch(Exception ex)
    {
        MessageBox.Show(ex.message);
    }
    return false;
}

Ich persönlich stelle die return-Anweisung am Ende der Methode statt im catch-Block. Aber beiden geht es gut. Es geht um Lesbarkeit (subjektiv) und Richtlinien in Ihrem Unternehmen.

7
Bart

Ja, das ist völlig normal. 

Vergessen Sie nicht, dass Sie auch finally block verwenden können, um nach der Rückkehr ausgeführt zu werden.

2
Piotr Justyna

Dies ist nicht falsch, aber wenn Sie eine Ressource verwendet haben, wird in der Regel zum Schließen ein Block verwendet, anstatt die close-Methode auch zweimal aufzurufen. In diesem Fall können Sie die return-Anweisung nach dem finally-Block verwenden.

2
Feyyaz

Ist für mich eine sinnvolle Funktion für eine Funktion, die bei Erfolg den Wert true und bei einem Fehler den Wert false zurückgibt. Ich hoffe es stimmt nichts daran - ich mache es die ganze Zeit :)

0
Ray

Der Hauptzweck eines catch-Blocks besteht darin, einen Ort bereitzustellen, an dem eine Ausnahmesituation in einem try-Block ausgeführt werden kann. Sie haben also eine Ausnahme erkannt, sind sie weitergegangen ... und sind von einer Methode zurückgekehrt. Wenn sich die aufrufende Methode nicht für die Ausnahme interessiert, ist dies absolut normal. 

0
n535

Sie können eine return im catch-Block hinzufügen. Sie wissen ausdrücklich, dass Ihr Code zurückkehrt und die Ausführung fortsetzt, anstatt beim catch-Block anzuhalten. 

try{
    //do something
}
catch{
    //error handling
    return;
}

Anstatt eine Menge von try-catch-Blöcken in Ihrem Code zu haben, die verwirrend werden können und nur ein Durcheinander in Ihrem Code verursachen können, ist es besser, alles in Ihrem noe-try-catch zu behandeln und zu überprüfen, was der zurückgegebene Fehler war. 

try{
    //do something
}
catch (Exception as err){
    if (err == "IOException"){
         //handle exception
    else if (err.indexOf("TypeError"){
         //handle exception
    }
}

Auf zwei Arten kann geprüft werden, um welchen Typ es sich bei der Ausnahme handelt, sodass Sie eine entsprechende Meldung anzeigen können. Sie können auch nur bestimmte Ausnahmen abfangen, wenn Sie möchten, anstelle von Exception as err können Sie catch IOException, ...

0
E. Oregel