144 Stimmen

Ist es schlechte Praxis, aus einem try catch finally-Block zurückzukehren?

Heute Morgen bin ich auf einen Code gestoßen, der wie folgt aussah:

try
{
    x = SomeThingDangerous();
    return x;
}
catch (Exception ex)
{
    throw new DangerousException(ex);
}
finally
{
    CleanUpDangerousStuff();
}

Nun kompiliert dieser Code gut und funktioniert, wie es sollte, aber es fühlt sich einfach nicht richtig, um aus einem Try-Block zurückkehren, vor allem, wenn es eine zugeordnete finally.

Mein Hauptproblem ist, was passiert, wenn die schließlich eine Ausnahme von ihm selbst auslöst? Sie haben eine zurückgegebene Variable, aber auch eine Ausnahme, mit der Sie umgehen müssen... daher interessiert es mich, was andere über die Rückgabe aus einem Try-Block denken?

181voto

mmx Punkte 400975

Nein, das ist keine schlechte Praxis. Die Seite return wo es sinnvoll ist, verbessert die Lesbarkeit und Wartbarkeit und macht Ihren Code einfacher zu verstehen. Es sollte Ihnen egal sein, wie finally Block wird ausgeführt, wenn ein return Anweisung angetroffen wird.

24voto

Ed S. Punkte 118985

Die endgültige Vollstreckung erfolgt in jedem Fall, es spielt also keine Rolle.

19voto

Conrad Punkte 703

Ich persönlich würde diese Art der Kodierung vermeiden, da ich keine Return-Anweisungen vor finally-Anweisungen sehen möchte.

Mein Verstand ist einfach und verarbeitet die Dinge eher linear. Wenn ich also den Code zum Trockenlauf durchlaufe, neige ich dazu, zu denken, dass alles, was danach kommt, egal ist, sobald ich die Rückgabeanweisung erreicht habe, was in diesem Fall natürlich ziemlich falsch ist (nicht, dass es die Rückgabeanweisung beeinflussen würde, sondern was die Nebeneffekte sein könnten).

Ich würde also den Code so gestalten, dass die return-Anweisung immer nach den finally-Anweisungen erscheint.

12voto

Spencer Ruport Punkte 34547

Dies könnte Ihre Frage beantworten

Was passiert wirklich in einer try { return x; } finally { x = null; }-Anweisung?

Vom Lesen dieser Frage klingt es, wie Sie eine andere Try-Catch-Struktur in der Anweisung finally haben können, wenn Sie denken, es könnte eine Ausnahme auslösen. Der Compiler wird herausfinden, wann der Wert zurückgegeben werden muss.

Trotzdem ist es vielleicht besser, den Code umzustrukturieren, damit er Sie später nicht verwirrt, oder jemand anderes, der sich dessen vielleicht nicht bewusst ist.

8voto

Ifeanyi Echeruo Punkte 787

Funktionell gibt es keinen Unterschied.

Es gibt jedoch einen Grund, dies nicht zu tun. Längere Methoden mit mehreren Ausstiegspunkten sind oft schwieriger zu lesen und zu analysieren. Dieser Einwand hat jedoch mehr mit Return-Anweisungen als mit catch- und finally-Blöcken zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X