2010-12-12 102 views
9

這是一個關於best .net練習的問題。我總是捕獲並存儲關於我的所有網頁和窗口形式的應用程序異常信息如下:如何處理異常?

  1. 包圍嘗試catch(異常除外)
  2. 對於除前層的任何一層,每個方法拋出例外層以上
  3. 在前一層,將異常記錄到日誌文件(通常使用log4config.dll)並向用戶提供了一個用戶友好的消息。

這是處理異常的最佳方式嗎?或者我應該在下一個項目中做一些不同的事情?

+0

你是什麼意思1.Surrounded與嘗試捕捉每一個方法(例外的例外) – Stilgar 2010-12-12 19:29:00

+0

嘗試{//做一些事情}趕上(例外的例外){//做一些事情} – InfoLearner 2010-12-13 00:38:13

回答

2

下面的代碼是有問題的,因爲它會覆蓋e原來的堆棧跟蹤,這使得問題更加難以診斷:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw e; // re-throw; overwrites original stacktrace in 'e' 
    } 
} 

下面的代碼不具有上述堆棧跟蹤覆蓋問題,但仍是不必要的冗長:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw; // re-throw; preserves original stacktrace in 'e' 
    } 
} 

這兩個會更好寫如下。這是因爲,如果您在catch塊正在做的唯一的事情是重新拋出異常,就沒有必要寫catch塊都:

public void Foo() { 
    Bar(); 
} 
+4

確切的說,「扔ê 「更糟,因爲它丟失了堆棧並重新創建一個,它應該只是」拋出「而沒有任何參數。 – 2010-12-12 19:43:00

+0

因此,證明善意的代碼使事情變得更加容易:) – 2010-12-12 19:58:01

+0

@Simon - 好的發現。謝謝。我更新了我的答案。 – 2010-12-12 20:40:50

6

得到我不會增加1 & 2,除非我有一些具體的原因;例如改變(包裝)該消息;沒有必要,因爲例外情況無論如何都會上升。如果做得不正確,你可能會意外地刪除所有重要的堆棧跟蹤(throw; vs throw ex; - 首選首選)。

-1

這裏是如何到處理異常。

public void method1(){ 
    try{ 
     .... 
     // all the code goes here 
     // declare any helper methods throw throwable 
     // eg: private boolean check1() throws Throwable{ ...} 
     .... 
    }catch(Throwable t){ 
     System.out.println("oops...error...good luck debugging. "); 
    } 
} 
+0

沒有人可以建議採用更懶的方式來處理這種異常:) – rana 2011-11-28 21:43:03