Gibt es Situationen, in denen es angebracht ist, einen try-finallyBlock ohne catchBlock zu verwenden?
Antworten:
Sie würden es verwenden, um sicherzustellen, dass einige Aktionen nach dem tryInhalt 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 finallyBlock wird ausgeführt, bevor die Ausnahme über den Aufrufstapel weitergegeben wird.
Sie würden es auch versehentlich verwenden, wenn Sie das usingSchlü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 finallywird 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 finallyes 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();
}
usingist gleichwertig try-finally. Sie werden es nur verwenden, try-finallywenn Sie innen aufräumen möchten finallyund 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 usingfehlschlägt, schlägt Ihr Code nicht fehl.
Es gibt einige Bedingungen, unter denen finallynicht ausgeführt wird.
StackOverflowExceptionoder 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 .
tryund dann in a verringern finally, können Sie dies in einer usingAnweisung nicht tun .
Try-[Catch]-Finallyerledigt all das, ohne ein solches Objekt erstellen zu müssen.
usingaber 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.
tryundfinallyals " try-finally- Anweisung " bezieht .