Also bin ich heute Morgen auf einen Code gestoßen, der so aussah:
try
{
x = SomeThingDangerous();
return x;
}
catch (Exception ex)
{
throw new DangerousException(ex);
}
finally
{
CleanUpDangerousStuff();
}
Jetzt wird dieser Code gut kompiliert und funktioniert so, wie er sollte, aber es fühlt sich einfach nicht richtig an, aus einem try-Block zurückzukehren, insbesondere wenn es endlich einen zugeordneten gibt.
Mein Hauptproblem ist, was passiert, wenn das endlich eine eigene Ausnahme auslöst? Sie haben eine zurückgegebene Variable, aber auch eine Ausnahme ... also bin ich interessiert zu wissen, was andere über die Rückkehr aus einem try-Block denken?
c#
try-catch
try-catch-finally
Lomaxx
quelle
quelle
x
außerhalb destry
Blocks deklarieren müssen . Sie können die Erklärung in der Nähe der Verwendung aufbewahren.Antworten:
Nein, das ist keine schlechte Praxis. Wenn Sie dort platzieren,
return
wo es Sinn macht, verbessern Sie die Lesbarkeit und Wartbarkeit und machen Ihren Code einfacher zu verstehen. Es sollte Sie nicht interessieren, da derfinally
Block ausgeführt wird, wenn einereturn
Anweisung gefunden wird.quelle
Das wird endlich ausgeführt, egal was passiert, also spielt es keine Rolle.
quelle
Persönlich würde ich diese Art der Codierung vermeiden, da ich keine Lust habe, return-Anweisungen vor endgültigen Anweisungen zu sehen.
Mein Geist ist einfach und verarbeitet die Dinge eher linear. Wenn ich den Code für Trockenlauf durchlaufe, neige ich daher zu der Annahme, dass, sobald ich die return-Anweisung erreicht habe, alles Folgende keine Rolle spielt, was in diesem Fall offensichtlich ziemlich falsch ist (nicht, dass dies die return-Anweisung beeinflussen würde, aber was die Nebenwirkungen sein könnten).
Daher würde ich den Code so anordnen, dass die return-Anweisung immer nach den finally-Anweisungen erscheint.
quelle
Dies kann Ihre Frage beantworten
Was passiert wirklich bei einem Versuch? {Return x; } endlich {x = null; } Aussage?
Wenn Sie diese Frage lesen, klingt es so, als könnten Sie in der finally-Anweisung eine andere try catch-Struktur haben, wenn Sie glauben, dass sie eine Ausnahme auslösen könnte. Der Compiler wird herausfinden, wann der Wert zurückgegeben werden soll.
Trotzdem ist es möglicherweise besser, Ihren Code trotzdem neu zu strukturieren, damit Sie später nicht verwirrt werden oder jemand anderes, der sich dessen möglicherweise ebenfalls nicht bewusst ist.
quelle
Funktionell gibt es keinen Unterschied.
Es gibt jedoch einen Grund, dies nicht zu tun. Längere Methoden mit mehreren Austrittspunkten sind oft schwieriger zu lesen und zu analysieren. Dieser Einwand hat jedoch mehr mit return-Anweisungen zu tun als mit catch and finally blocks.
quelle
In Ihrem Beispiel ist jeder Weg gleichwertig. Ich wäre nicht einmal überrascht, wenn der Compiler denselben Code generieren würde. Wenn im finally-Block eine Ausnahme auftritt, treten dieselben Probleme auf, unabhängig davon, ob Sie die return-Anweisung in den Block oder außerhalb des Blocks einfügen.
Die eigentliche Frage ist stilistisch, welche am besten ist. Ich schreibe meine Methoden gerne so, dass es nur eine return-Anweisung gibt. Auf diese Weise ist es einfacher, den Ablauf der Methode zu sehen. Daraus folgt, dass ich auch die return-Anweisung als letzte setzen möchte, damit leicht zu erkennen ist, dass dies der Fall ist das Ende der Methode und das, was es zurückgibt.
Ich denke, da die return-Anweisung so ordentlich platziert ist wie die letzte Anweisung, ist es weniger wahrscheinlich, dass andere kommen und mehrere return-Anweisungen in andere Teile der Methode streuen.
quelle