2013-02-04 15 views
1

有沒有辦法檢查是否在較高的應用程序級別上處理異常以跳過日誌記錄並重新拋出?像這樣,例如:檢查是否在上一級處理異常

 try 
     { 
      // Execute some code 
     } 
     catch (Exception e) 
     { 
      if(!ExceptionIsHandled()) 
       LogError(e); 
      throw e; 
     } 
+3

你的意思是,你可以搶先檢查調用方法是否捕獲/處理異常?我不會指望它。編輯:你真的應該使用'throw;'(而不是'扔e;')。通常我只在最高級別有錯誤處理/日誌記錄代碼(在'Main'方法或應用程序'UnhandledException'-ish事件中。讓它冒泡。 –

+2

你不應該'拋出e;'''throw ;'這裏已經足夠了。 –

+0

異常會一直冒泡,直到a。)東西處理它或b。)沒有處理它。一旦處理了它,就是這樣。你可以重新拋出,但這並不能幫助你的情況。 –

回答

1

沒有我所知道的。如果您致力於此設計(請參見結尾處的註釋),您可以可以爲編寫一個例外的包裝,這是一種HandledException,只是使其InnerException成爲拋出的例外。然後,你可以讓你的代碼看起來象:

try 
    { 
     // Execute some code 
    } 
    catch (HandledException e) 
    { 
     LogError(e.InnerException); 
     // Do something else 
    } 
    catch (Exception e) 
    { 
     throw ; 
    } 

這裏談到的刻板#1「你在幹什麼錯」的答案的一部分...

然而,如果你真正「處理」了例外情況,重新投擲它沒有多大意義。也許你的方法應該只返回一個失敗結果,可能包括Exception作爲一個細節項目出了什麼問題。

0

嗯不,還沒到那裏呢。異常通過處理程序冒泡。 通常的方式去做這件事。 是定義你自己的例外,然後只抓住你將要處理的地方。

0

如果您可以確定代碼被包裝在一個專門設計的try-catch塊中,該塊使用支持異常過濾器的語言編寫,那麼可以在堆棧展開之前或過程中確定是否可能發生異常被該外部擋塊或內部擋塊擋住。但是,這種方法的用處是非常有限的,特別是考慮到代碼捕獲和重新拋出異常的非常常見的反模式,它知道它不會解決,只是爲了找出它們發生的目的。

如果你的目標只是爲了避免多餘的日誌記錄,我建議你應該使用可以有效處理冗餘的日誌記錄工具。雖然有些人可能會爭辯說在外層只記錄一次異常情況會更好,但有更多的日誌記錄機會是有利的。如果內層發生異常並且中間層吞下它,外層中的日誌代碼將永遠不會發現它。相比之下,如果內層是通過捕獲異常並安排它進行記錄而開始的,那麼即使中間層吞下異常,它發生的事實仍然可以被記錄下來。