2008-08-30 9 views
4

私は、IDisposableを実装するオブジェクトを持っているが、最近私が普通のtry/catch/finallyのように例外をキャッチする方法を理解していないということが、ますます多くなっています。 ..右の方向に私を指す任意のコードサンプル?.NET 2.0を使用しているブロックで例外をキャッチする方法は?

編集:この質問は回答を読んだ後に変更されました。 「.NET 2.0を使用しているブロックで例外をスローする方法」でした。実際には、使用ブロック内でこれらの例外をキャッチする方法を探していました。


私は、自分のキャッチブロックを使用ブロック内で回転させる方法について詳しくは探しています。

編集:私が避けたかったのは、@Blairのように私の使用ブロック内にtry/catch/finallyを使用しなければならないことでした。しかし、これは問題ではないかもしれません...

編集:@Blair、これは私が探していたものです。

答えて

7

私は本当にその質問を理解していません - あなたは通常どおり例外を投げます。 MyThingIDisposableを実装した場合、:あなたがブロックを残すように例外がスローされますよう

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

そしてthing.Disposeは、呼び出されます。

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

(または使用中のtry/catch /最後に置く):

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

それとも、/ついにのtry/catchと使用して、あなたのいずれかを行うことができ巣それらを結合する場合usingを展開して、finallyブロックでDisposeを明示的に呼び出すことができます。finally(またはcatch)に必要な余分な例外処理コードまたは-recoveryコードを追加して、@Quarrelsomeが示すようにブロックすることができます。

EDIT:あなたのDisposeメソッドが呼び出されることを確実にすることとは別に、例外を処理する必要がある場合@Toranビラップスに対応して、あなたがusingtry/catch/finallyを使用する必要がありますかusingをアンロールよどちらか - 私は考えていませんあなたが望むものを達成するための他の方法があります。あなたは例外

あなたが使用してブロック内でtry文を使用するかは、tryブロック

で使用してブロックを使用することができますいずれかをキャッチするtry文を持っている必要があります。しかし、あなたが使用する必要が

4

はいブロックを使用して例外をスローすることについては何も変わりありません。 を使用してブロックは、基本的に変換することを忘れないでください:あなたがキャッチ以外のものをキャッチしたいのであれば、あなたがあなた自身のキャッチをロールバックする必要があります

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

/投げは、使用してから完全に分離懸念があります。最終的には、実行することがほぼ保証されています(検出できない例外(例:スタックオーバーフローやメモリ不足)またはPCの電源を切っている人)。

0

例外が発生するのをブロックするtryブロック