Gibt es Situationen, in denen es angebracht ist, einen try-finally
Block ohne catch
Block zu verwenden?
77
Gibt es Situationen, in denen es angebracht ist, einen try-finally
Block ohne catch
Block zu verwenden?
try
undfinally
als " try-finally- Anweisung " bezieht .Antworten:
Sie würden es verwenden, um sicherzustellen, dass einige Aktionen nach dem
try
Inhalt oder einer Ausnahme ausgeführt werden, aber wenn Sie diese Ausnahme nicht verwenden möchten.Nur um klar zu sein, dies verbirgt keine Ausnahmen. Der
finally
Block wird ausgeführt, bevor die Ausnahme über den Aufrufstapel weitergegeben wird.Sie würden es auch versehentlich verwenden, wenn Sie das
using
Schlüsselwort verwenden, da dies zu einem kompiliert wirdtry-finally
(keine exakte Konvertierung, aber aus Gründen der Argumentation ist es nah genug).try { TrySomeCodeThatMightException(); } finally { CleanupEvenOnFailure(); }
Es
finally
wird nicht garantiert, dass Code ausgeführt wird, aber der Fall, in dem er nicht garantiert wird, ist ziemlich randvoll - ich kann mich nicht einmal daran erinnern. Alles, woran ich mich erinnere, ist, wenn Sie in diesem Fall sind, stehen die Chancen sehr gut, dassfinally
es nicht Ihr größtes Problem ist , nicht zu laufen :-) Schwitzen Sie also im Grunde nicht.Update von Tobias:
finally
Wird nicht ausgeführt, wenn der Prozess beendet wird.Update von Paddy: Bedingungen, unter denen es schließlich nicht in einem .net try..finally-Block ausgeführt wird
Das häufigste Beispiel, das Sie möglicherweise sehen, ist das Entsorgen einer Datenbankverbindung oder einer externen Ressource, selbst wenn der Code fehlschlägt:
using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-) { // Do stuff. }
Kompiliert zu so etwas wie:
SqlConnection conn; try { conn = new SqlConnection(""); // Do stuff. } finally { if (conn != null) conn.Dispose(); }
quelle
using
ist gleichwertigtry-finally
. Sie werden es nur verwenden,try-finally
wenn Sie innen aufräumen möchtenfinally
und sich nicht um die Ausnahme kümmern.Der beste Ansatz wird sein
try { using(resource) { //Do something here } }catch(Exception) { //Handle Error }
Selbst wenn die von aufgerufene Bereinigung
using
fehlschlägt, schlägt Ihr Code nicht fehl.Es gibt einige Bedingungen, unter denen
finally
nicht ausgeführt wird.StackOverflowException
oderExecutingEngineException
.Hoffe das beantwortet deine Zweifel.
quelle
Wenn Sie beispielsweise eine nicht verwaltete Ressource haben, die Sie im try-Block erstellen und verwenden, können Sie den finally-Block verwenden, um sicherzustellen, dass Sie diese Ressource freigeben. Der finally-Block wird immer ausgeführt, unabhängig davon, was im try-Block passiert (z. B. Ausnahmen).
ZB lautet die Anweisung lock (x) wirklich:
System.Threading.Monitor.Enter(x); try { ... } finally { System.Threading.Monitor.Exit(x); }
Der finally-Block wird immer aufgerufen, um sicherzustellen, dass die exklusive Sperre aufgehoben wird.
quelle
Gute Erklärung mit Code:
void MyMethod1() { try { MyMethod2(); MyMethod3(); } catch(Exception e) { //do something with the exception } } void MyMethod2() { try { //perform actions that need cleaning up } finally { //clean up } } void MyMethod3() { //do something }
Wenn entweder MyMethod2 oder MyMethod3 eine Ausnahme auslöst, wird diese von MyMethod1 abgefangen. Der Code in MyMethod2 muss jedoch Bereinigungscode ausführen, z. B. das Schließen einer Datenbankverbindung, bevor die Ausnahme an MyMethod1 übergeben wird.
http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+doesn+t+throw+error+Why+no+syntax+error+
quelle
Sie benötigen einen finally-Block, wenn unabhängig davon, welche (falls vorhanden) Ausnahmen abgefangen werden oder auch wenn keine abgefangen werden, Sie dennoch Code ausführen möchten, bevor der Block beendet wird. Beispielsweise möchten Sie möglicherweise eine geöffnete Datei schließen.
Siehe auch try-finally
quelle
try / finally: Wenn Sie keine Ausnahmen behandeln möchten, aber sicherstellen möchten, dass einige Aktionen ausgeführt werden, unabhängig davon, ob eine Ausnahme vom aufgerufenen Code ausgelöst wird oder nicht.
quelle
Ich weiß nichts über C #, aber es scheint, dass alles, was Sie mit einem try-finally tun könnten, Sie eleganter mit einer using-Anweisung tun könnten . C ++ hat aufgrund seines RAII nicht einmal ein endgültiges Ergebnis .
quelle
try
und dann in a verringernfinally
, können Sie dies in einerusing
Anweisung nicht tun .Try-[Catch]-Finally
erledigt all das, ohne ein solches Objekt erstellen zu müssen.using
aber Sie können die pauschale Aussage nicht so machen, wie Sie es getan haben. Wiederum definiert das das Problem durch die Lösung, die für mich rückwärts ist.Hier ist eine Situation, in der Sie try finally verwenden möchten: Wenn Sie normalerweise eine using-Anweisung verwenden würden, dies jedoch nicht können, weil Sie eine Methode durch Reflektion aufrufen.
Das wird nicht funktionieren
using (objMsg = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("omApp.MessagingBO"))) { }
stattdessen verwenden
object objMsg = null; try { objMsg = Activator.CreateInstance(TypeAssist.GetTypeFromTypeName("myAssembly.objBO")); strResponse = (string)objMsg.GetType().InvokeMember("MyMethod", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, objMsg, new object[] { vxmlRequest.OuterXml }); } finally { if (objMsg!=null) ((IDisposable)objMsg).Dispose(); }
quelle
Schauen Sie sich den folgenden Link an: /software/131397/why-use-try-finally-without-a-catch-clause
Dies hängt von der Architektur Ihrer Anwendung und der Operation ab, die Sie im Block ausführen.
quelle
Hier ist ein Anwendungsfall, den ich immer (ähm ..) benutze:
int? x; //note the nullable type here! try { x = int.Parse(someString); } catch { } //don't care, let it just be null
quelle
1. Wir können den try-Block ohne catch verwenden, aber wir sollten den catch / finally-Block verwenden. 2.Wir können nicht nur try block verwenden.
quelle