Gibt es Situationen, in denen es angebracht ist, einen try-finally
Block ohne catch
Block zu verwenden?
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 wird try-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, dass finally
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();
}
using
ist gleichwertig try-finally
. Sie werden es nur verwenden, try-finally
wenn Sie innen aufräumen möchten finally
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
oder ExecutingEngineException
.Hoffe das beantwortet deine Zweifel.
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.
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.
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
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.
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 .
try
und dann in a verringern finally
, können Sie dies in einer using
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();
}
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.
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.
try
undfinally
als " try-finally- Anweisung " bezieht .