我試圖寫它具有potentian拋出一個異常Dispose
方法。檢測例外finally塊
的Dispose被調用以try-finally
圖案,經由using
語句:
using(var widget = new Widget())
{
widget.DoYourThing();
}
的問題是,如果一個異常由Dispose
方法提出,它取代了可能在已經提出的任何異常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方法不應該拋出的結論。 –
「這往往導致對處置方法不應該拋出任何結論」 - 避免如果可以的話,扔當然,但一些處置的實現需要拋出。例如,FileStream的Dispose方法將嘗試刷新所有緩衝的數據,並在該刷新失敗時拋出。默默無視數據刷新失敗顯然不是一種選擇,所以我認爲在一般情況下,您必須期望Dispose方法可以拋出。 – Joe
目前,我的'Dispose'實現吞下內部方法引發的所有異常,就像一個很好的小實現。它只會導致問題,因爲異常本身就會丟失。我可能只是傾向於將異常寫入診斷跟蹤並保持實現原樣。 –