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;
}
}
Sie können normalerweise vom catch-Block zurückkehren .. _. Normalerweise ist es ein guter Funktionscode.
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.
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.
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
}
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.
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.
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.
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 :)
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.
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, ...