2008-08-30 8 views
4

Ich versuche den Benutzungsblock in diesen Tagen mehr und mehr zu nutzen, wenn ich ein Objekt habe, das IDisposable implementiert, aber eine Sache, die ich nicht herausgefunden habe, ist, wie man eine Ausnahme fängt, wie ich es normalerweise tun würde. .. irgendwelche Code-Beispiele, um mich in die richtige Richtung zu weisen?So fangen Sie eine Ausnahme in einem using-Block mit .NET 2.0?

Bearbeiten: Die Frage wurde nach dem Lesen der Antworten geändert. Es war "Wie man eine Ausnahme in einem using Block mit .NET 2.0 wirft?" aber ich suchte nach einer Möglichkeit, diese Ausnahmen in einem using-Block zu finden.


Ich bin auf der Suche nach weiteren Details zum Rollen meiner eigenen Fangblock in einem Block verwenden.

Edit: Was ich vermeiden wollte, ist eine try/catch/schließlich in meinem verwenden Block wie @Blair zeigte. Aber vielleicht ist das ein Nicht-Problem ...

Edit: @Blair, das ist genau das, was ich gesucht habe, danke für die detaillierte Antwort!

Antwort

7

Ich verstehe nicht wirklich die Frage - Sie werfen eine Ausnahme wie Sie normalerweise würden. Wenn MyThing Geräte IDisposable, dann:

using (MyThing thing = new MyThing()) 
{ 
    ... 
    throw new ApplicationException("oops"); 
} 

Und thing.Dispose wird aufgerufen, wie Sie den Block, als die Ausnahme des geworfen verlassen. Wenn Sie einen try/catch/finally und eine Verwendung kombinieren möchten, können Sie entweder Nest ihnen:

try 
{ 
    ... 
    using (MyThing thing = new MyThing()) 
    { 
     ... 
    } 
    ... 
} 
catch (Exception e) 
{ 
    .... 
} 
finally 
{ 
    .... 
}  

(Oder legen Sie die try/catch/finally in der Verwendung):

using (MyThing thing = new MyThing()) 
{ 
    ... 
    try 
    { 
     ... 
    } 
    catch (Exception e) 
    { 
     .... 
    } 
    finally 
    { 
     .... 
    }  
    ... 
} // thing.Dispose is called now 

Or Sie können die using ausrollen und explizit Dispose im finally Block aufrufen, wie @Quarseles gezeigt hat, indem Sie alle zusätzlichen Ausnahmebehandlungs- oder -wiederherstellungscodes hinzufügen, die Sie in der finally (oder in der catch) benötigen.

EDIT: Als Reaktion auf @Toran Billups, wenn Sie Ausnahmen verarbeiten müssen außer sicherzustellen, dass Ihre Dispose Methode aufgerufen wird, werden Sie entweder eine verwenden using und try/catch/finally oder entrollen die using - ich nicht denkt Es gibt noch einen anderen Weg, um das zu erreichen, was Sie wollen.

4

Ja, es gibt nichts anderes beim Auslösen von Ausnahmen bei der Verwendung von Blöcken. Denken Sie daran, dass die Verwendung von Block übersetzt grundsätzlich:

IDisposable disposable = null; 
try 
{ 
    disposable = new WhateverYouWantedToMake(); 
} 
finally 
{ 
    disposable.Dispose() 
} 

So haben Sie Ihren eigenen Fang rollen, wenn Sie etwas wollen, aber Fang/Wurf fangen ist eine völlig getrennte Sorge von der Verwendung. Es ist fast garantiert, dass die Ausführung ausgeführt wird (speichern Sie eine nicht behebbare Ausnahme (z. B. Stackoverflow oder Outofmemory) oder jemanden, der die Stromversorgung aus dem PC zieht).

0

Sie benötigen einen try-Anweisung haben, eine Ausnahme zu fangen

Entweder können Sie eine try-Anweisung innerhalb des using-Block verwenden, oder Sie können einen mit Block in einem Try-Block

Aber Sie müssen verwenden verwenden, ein Versuch Block, um alle Ausnahmen

zu fangen