私はDispose
メソッドを作成しようとしていますが、例外をスローする可能性があります。finallyブロックで例外を検出しました
using(var widget = new Widget())
{
widget.DoYourThing();
}
問題は例外がDispose
方法によって提起された場合、それが中に提起されている可能性のある例外を置き換えることです:
処分はusing
声明を通じて、try-finally
パターンで呼び出されますusing
ブロックのボディ。通常、この例外は本体にスローされる例外よりもあまり役に立ちません。
Dispose
メソッドは、すでに例外が発生している場合には、独自の例外を呑み込むように記述することをお勧めします。以下のようなものが理想的でしょう:
protected virtual void Dispose(bool disposing)
{
try
{
this.Shutdown();
}
catch(Exception)
{
this.Abort();
// Rethrow the exception if there is not one already in progress.
if(!Runtime.IsHandlingException)
{
throw;
}
}
}
この情報を提供できるものはありますか?
ここには一般的な問題があります。Disposeパターンを実装する場合、Diposeメソッドはファイナライザスレッドで呼び出すことができます。順番に、ファイナライザのルールはあなたが*投げてはいけないということです。これは、Disposeメソッドが投げてはならないという結論につながる傾向があります。 –
"これは、Disposeメソッドが投げてはならないという結論につながる傾向があります。" - もちろん投げることは避けますが、Dispose実装の中にはスローする必要があるものもあります。たとえば、FileStreamのDisposeメソッドはバッファリングされたデータをフラッシュしようとし、このフラッシュが失敗した場合にスローします。データをフラッシュする際の失敗を黙って無視することは明らかではないので、一般的なケースでは、Disposeメソッドがスローできると考える必要があります。 – Joe
現在、私の 'Dispose'実装は良い実装のような内部メソッドによって発生したすべての例外を取り除きます。例外自体が失われるため、問題が発生します。私は、診断トレースに例外を書いて、実装をそのままの状態に保つ傾向があります。 –