Was auch immer sich in den endgültigen Blöcken befindet, wird (fast) immer ausgeführt. Was ist also der Unterschied zwischen dem Einschließen von Code oder dem Nicht-Schließen von Code?
c#
exception-handling
Rodrigo
quelle
quelle
Antworten:
Der Code in einem finally-Block wird ausgeführt, unabhängig davon, ob eine Ausnahme vorliegt oder nicht. Dies ist sehr praktisch, wenn es um bestimmte Reinigungsfunktionen geht, die Sie immer wie das Schließen von Verbindungen ausführen müssen.
Ich vermute, Ihre Frage ist, warum Sie dies tun sollten:
Wenn Sie dies tun können:
Die Antwort ist, dass der Code in Ihrer catch-Anweisung häufig entweder eine Ausnahme erneut auslöst oder aus der aktuellen Funktion ausbricht. Mit dem letzteren Code wird "alwaysDoThis ();" Der Aufruf wird nicht ausgeführt, wenn der Code in der catch-Anweisung eine Rückgabe ausgibt oder eine neue Ausnahme auslöst.
quelle
Die meisten Vorteile der Verwendung von try-finally wurden bereits hervorgehoben, aber ich dachte, ich würde diesen hinzufügen:
Dieses Verhalten macht es in verschiedenen Situationen sehr nützlich, insbesondere wenn Sie eine Bereinigung durchführen (Ressourcen entsorgen) müssen, obwohl ein using- Block in diesem Fall häufig besser ist.
quelle
Jedes Mal, wenn Sie nicht verwaltete Codeanforderungen wie Stream-Reader, Datenbankanforderungen usw. verwenden. und wenn Sie die Ausnahme abfangen möchten, verwenden Sie try catch finally und schließen Sie den Stream, den Datenleser usw. im finally. Wenn Sie dies nicht tun, wenn die Fehler nicht geschlossen werden, ist dies bei Datenbankanforderungen wirklich schlecht
Wenn Sie den Fehler nicht abfangen möchten, verwenden Sie
und das Verbindungsobjekt wird automatisch entsorgt, wenn ein Fehler auftritt, Sie den Fehler jedoch nicht erfassen
quelle
Denn schließlich wird ausgeführt, auch wenn Sie keine Ausnahme in einem catch-Block behandeln.
quelle
Schließlich können Anweisungen auch nach der Rückkehr ausgeführt werden.
quelle
finally
, wie in:ist eine garantierte Möglichkeit, Code nach Ihrem
try..catch
Block auszuführen , unabhängig davon, ob Ihr try-Block eine Ausnahme ausgelöst hat oder nicht.Das macht es perfekt für Dinge wie das Freigeben von Ressourcen, Datenbankverbindungen, Dateihandles usw.
quelle
Ich werde die Verwendung von schließlich mit einer Dateireader-Ausnahme erklären. Beispiel
Wenn im obigen Beispiel die Datei mit dem Namen Data.txt fehlt, wird eine Ausnahme ausgelöst und behandelt, aber die aufgerufene Anweisung
StreamReader.Close();
wird niemals ausgeführt.Aus diesem Grund wurden die mit dem Leser verbundenen Ressourcen nie freigegeben.
Viel Spaß beim Codieren :)
Hinweis: "@" wird verwendet, um eine wörtliche Zeichenfolge zu erstellen , um den Fehler "Nicht erkannte Escape-Sequenz" zu vermeiden. Das @ -Symbol bedeutet, diese Zeichenfolge wörtlich zu lesen und Steuerzeichen nicht anders zu interpretieren.
quelle
Angenommen, Sie müssen den Cursor anstelle eines wartenden (Sanduhr-) Cursors auf den Standardzeiger zurücksetzen. Wenn vor dem Setzen des Cursors eine Ausnahme ausgelöst wird und die App nicht sofort abstürzt, kann ein verwirrender Cursor zurückbleiben.
quelle
Manchmal möchten Sie keine Ausnahme behandeln (kein catch-Block), aber Sie möchten, dass Bereinigungscode ausgeführt wird.
Beispielsweise:
quelle
Der finally-Block ist nützlich, um alle im try-Block zugewiesenen Ressourcen zu bereinigen und Code auszuführen, der ausgeführt werden muss, auch wenn eine Ausnahme vorliegt. Die Steuerung wird immer an den finally-Block übergeben, unabhängig davon, wie der try-Block beendet wird.
quelle
Ahh ... ich glaube ich sehe was du sagst! Ich habe eine Sekunde gebraucht ... Sie fragen sich, "warum Sie es in den finally-Block anstatt nach dem finally-Block und vollständig außerhalb des try-catch-finally-Blocks legen".
Dies kann beispielsweise daran liegen, dass Sie die Ausführung anhalten, wenn Sie einen Fehler auslösen, aber dennoch Ressourcen wie geöffnete Dateien, Datenbankverbindungen usw. bereinigen möchten.
quelle
Der Kontrollfluss des finally-Blocks erfolgt entweder nach dem Try- oder dem Catch-Block.
mit Ausnahme 1> 2> 3> 4> 5, wenn 3 eine Return-Anweisung 1> 2> 3> 4 hat
ohne Ausnahme 1> 2> 4> 5, wenn 2 eine return-Anweisung 1> 2> 4 hat
quelle
Wie in der Dokumentation erwähnt :
Es lohnt sich auch das Lesen dieser , in der es heißt:
Es ist also klar, dass Code, der sich in einer
finally
Klausel befindet, auch dann ausgeführt wird, wenn eine vorherigecatch
Klausel einereturn
Anweisung enthält.quelle