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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top