.NET 2.0 で using ブロックで例外をキャッチするにはどうすればよいですか?
-
09-06-2019 - |
質問
最近、IDisposable を実装するオブジェクトがあるときに using ブロックをますます活用しようとしていますが、理解できていないことが 1 つあります。それは、通常の try/catch/finally のように例外をキャッチする方法です。正しい方向に導くためのコードサンプルはありますか?
編集:返信を読んだ後、質問は変更されました。それは「.NET 2.0を使用してブロックを使用する方法で例外をスローする方法」でした。しかし、私は実際に使用しているブロック内でこれらの例外をキャッチする方法を探していました。
using ブロック内で独自のキャッチ ブロックをローリングする方法の詳細を探しています。
編集:私が避けたかったのは、@Blairが示したように、usingブロック内でtry/catch/finallyを使用する必要があることです。でも、もしかしたらこれは問題ないかもしれません…
編集:@Blair、これはまさに私が探していたものです、詳細な返信をありがとう!
解決
質問の意味がよくわかりません。通常どおり例外をスローします。もし MyThing
実装する IDisposable
, 、 それから:
using ( MyThing thing = new MyThing() )
{
...
throw new ApplicationException("oops");
}
そして thing.Dispose
例外がスローされると、ブロックを離れるときに呼び出されます。try/catch/finally と using を組み合わせたい場合は、それらをネストすることができます。
try
{
...
using ( MyThing thing = new MyThing() )
{
...
}
...
}
catch ( Exception e )
{
....
}
finally
{
....
}
(または、try/catch/finally を using に入れます):
using ( MyThing thing = new MyThing() )
{
...
try
{
...
}
catch ( Exception e )
{
....
}
finally
{
....
}
...
} // thing.Dispose is called now
または、展開することもできます using
そして明示的に呼び出します Dispose
の中に finally
@Quarrelsome が示したようにブロックし、必要な例外処理または回復コードを追加します。 finally
(または catch
).
編集:@Toran Billups への返信として、確実に例外を処理する必要がある場合は、 Dispose
メソッドが呼び出される場合は、次のいずれかを使用する必要があります using
そして try/catch/finally
または展開します using
- あなたが望んでいることを達成する他の方法はないと思います。
他のヒント
はい、ブロックを使用する際に例外をスローすることに違いはありません。using ブロックは基本的に次のように変換されることに注意してください。
IDisposable disposable = null;
try
{
disposable = new WhateverYouWantedToMake();
}
finally
{
disposable.Dispose()
}
したがって、何かをキャッチしたい場合は、自分でキャッチをロールする必要がありますが、キャッチ/スローは使用とは完全に別の問題です。Final はほぼ確実に実行されます (キャッチできない例外 (例:stackoverflow または outofmemory)、または誰かが PC から電源を抜いています)。
例外をキャッチするには try ステートメントが必要です
using ブロック内で try ステートメントを使用することも、try ブロック内で using ブロックを使用することもできます。
ただし、発生する例外をキャッチするには try ブロックを使用する必要があります。