2011-08-26 60 views
6

我試圖寫它具有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; 
     } 
    } 
} 

有任何可以提供這些信息?

+5

這裏有一個普遍的問題 - 如果你實現Dispose模式,您Dipose方法可以終結線程調用。反過來,終結者的規則是你*不應該拋出*。這往往導致Dispose方法不應該拋出的結論。 –

+2

「這往往導致對處置方法不應該拋出任何結論」 - 避免如果可以的話,扔當然,但一些處置的實現需要拋出。例如,FileStream的Dispose方法將嘗試刷新所有緩衝的數據,並在該刷新失敗時拋出。默默無視數據刷新失敗顯然不是一種選擇,所以我認爲在一般情況下,您必須期望Dispose方法可以拋出。 – Joe

+0

目前,我的'Dispose'實現吞下內部方法引發的所有異常,就像一個很好的小實現。它只會導致問題,因爲異常本身就會丟失。我可能只是傾向於將異常寫入診斷跟蹤並保持實現原樣。 –

回答

1

是確有必要爲您的Dispose方法能夠拋出異常?

也許你應該創建一個不同名稱的其他處理方法,並有必要時拋出異常。然後,通過調用其他方法,包裹在一個try塊會吞下例外,這樣Dispose不會拋出實施Dispose

+0

我希望你能從我的例子中看到'Shutdown'就是你所描述的方法。我目前的實現確實吞噬了這種方法引發的所有異常,但其中一些異常有價值。 –