Wie fange ich eine Ausnahme in einem using-Block mit .NET 2.0 ab?
-
09-06-2019 - |
Frage
Ich versuche heutzutage immer mehr, den Using-Block zu nutzen, wenn ich ein Objekt habe, das IDisposable implementiert, aber eine Sache, die ich nicht herausgefunden habe, ist, wie ich eine Ausnahme abfangen kann, wie ich es bei einem normalen try/catch/finally tun würde ...Gibt es Codebeispiele, die mir den richtigen Weg weisen?
Bearbeiten:Die Frage wurde nach Durchsicht der Antworten geändert.Es war "Wie man eine Ausnahme in einen Gebrauchsblock mit .NET 2.0 bringt?" Aber ich suchte tatsächlich nach einer Möglichkeit, diese Ausnahmen innerhalb eines verwendeten Blocks zu fangen.
Ich suche nach weiteren Details zum Rollen meines eigenen Fangblocks innerhalb eines Verwendungsblocks.
Bearbeiten:Was ich vermeiden wollte, ist die Verwendung eines try/catch/finally in meinem using-Block, wie @Blair gezeigt hat.Aber vielleicht ist das kein Problem ...
Bearbeiten:@Blair, das ist genau das, wonach ich gesucht habe, danke für die ausführliche Antwort!
Lösung
Ich verstehe die Frage nicht wirklich – Sie lösen eine Ausnahme aus, wie Sie es normalerweise tun würden.Wenn MyThing
implementiert IDisposable
, Dann:
using ( MyThing thing = new MyThing() )
{
...
throw new ApplicationException("oops");
}
Und thing.Dispose
wird aufgerufen, wenn Sie den Block verlassen, da die Ausnahme ausgelöst wird.Wenn Sie try/catch/finally und using kombinieren möchten, können Sie diese entweder verschachteln:
try
{
...
using ( MyThing thing = new MyThing() )
{
...
}
...
}
catch ( Exception e )
{
....
}
finally
{
....
}
(Oder fügen Sie try/catch/finally in das using ein):
using ( MyThing thing = new MyThing() )
{
...
try
{
...
}
catch ( Exception e )
{
....
}
finally
{
....
}
...
} // thing.Dispose is called now
Oder Sie können das ausrollen using
und explizit aufrufen Dispose
im finally
Block, wie @Quarrelsome demonstriert hat, und fügen Sie dabei jeden zusätzlichen Ausnahmebehandlungs- oder Wiederherstellungscode hinzu, den Sie benötigen finally
(oder im catch
).
BEARBEITEN:Als Antwort an @Toran Billups: Wenn Sie Ausnahmen verarbeiten müssen, außer sicherzustellen, dass Ihre Dispose
Methode aufgerufen wird, müssen Sie entweder a verwenden using
Und try/catch/finally
oder entrollen Sie die using
- Ich glaube nicht, dass es einen anderen Weg gibt, das zu erreichen, was Sie wollen.
Andere Tipps
Ja, es gibt keinen Unterschied beim Auslösen von Ausnahmen bei der Verwendung von Blöcken.Denken Sie daran, dass der using-Block im Wesentlichen Folgendes bedeutet:
IDisposable disposable = null;
try
{
disposable = new WhateverYouWantedToMake();
}
finally
{
disposable.Dispose()
}
Sie müssen also Ihr eigenes Fangen durchführen, wenn Sie etwas fangen möchten, aber das Fangen/Werfen ist ein völlig anderes Anliegen als das Verwenden.Die Ausführung von „final“ ist fast garantiert (außer einer nicht abfangbaren Ausnahme (z. B.Stackoverflow oder Outofmemory) oder jemand zieht den Strom aus dem PC).
Sie benötigen eine try-Anweisung, um eine Ausnahme abzufangen
Sie können entweder eine try-Anweisung innerhalb des using-Blocks oder einen using-Block in einem try-Block verwenden
Sie müssen jedoch einen Try-Block verwenden, um auftretende Ausnahmen abzufangen