4

IDisposableを実装するオブジェクトがある場合、最近、usingブロックをますます活用しようとしていますが、私が理解していないことの1つは、通常のtry / catch/finallyのように例外をキャッチする方法です...私を正しい方向に向けるためのコードサンプルはありますか?

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


自分のキャッチングブロックをusingブロック内で転がす方法の詳細を探しています。

編集:私が避けたかったのは、@Blairが示したように使用ブロック内でtry/ catch/finallyを使用する必要があることです。しかし、おそらくこれは問題ではありません...

編集:@ブレア、これはまさに私が探していたものです、詳細な返信に感謝します!

4

3 に答える 3

7

私はその質問を本当に理解していません-あなたはいつものように例外を投げます。MyThingを実装する場合、次のようIDisposableになります。

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

そしてthing.Dispose、例外がスローされると、ブロックを離れるときに呼び出されます。try / catch / finalとusingを組み合わせたい場合は、次のいずれかをネストできます。

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

(または、try / catch / finalを使用に入れます):

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

または、@ Quarrelsomeが示すように、ブロックを展開しusingて明示的に呼び出し、 (または)に必要な例外処理または回復コードを追加することもできます。Disposefinallyfinallycatch

編集:@Toran Billupsに応じて、Disposeメソッドが呼び出されることを確認する以外に例外を処理する必要がある場合は、を使用するか、展開する必要がusingあります-私はあなたが何を達成するか他の方法はないと思います欲しいです。try/catch/finallyusing

于 2008-08-30T16:32:01.327 に答える
4

ええ、ブロックの使用で例外をスローすることについては何も違いはありません。usingブロックは基本的に次のように変換されることに注意してください。

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

したがって、何かをキャッチしたい場合は、自分でキャッチをロールする必要がありますが、キャッチ/スローは使用とはまったく別の関心事です。finalは、ほぼ確実に実行されます(キャッチできない例外(スタックオーバーフローやメモリ不足など)を保存するか、誰かがPCから電源を切ります)。

于 2008-08-30T16:27:31.353 に答える
0

例外をキャッチするには、try ステートメントが必要です。

using ブロック内で try ステートメントを使用するか、try ブロック内で using ブロックを使用できます。

ただし、発生した例外をキャッチするには、try ブロックを使用する必要があります。

于 2010-05-21T21:01:09.357 に答える