2012-07-18 68 views
-1

更棒的是,爲什麼:嘗試抓住裏面還是外面?

public void Main() 
{ 
    SomeMethod(); 
} 
public void SomeMethod() 
{ 
    try 
    { 
    // code 
    } 
    catch(Exception) 
    { 
    } 
} 

或本:

public void Main() 
{ 
    try 
    { 
     SomeMethod(); 
    } 
    catch(Exception) 
    { 
    } 
} 
+6

這取決於。該方法的合同是什麼?我投票結束爲「不具建設性」。另外,大部分時間都是空的。 – 2012-07-18 23:32:04

+0

@pst - 該方法的合同?你什麼意思? – 2012-07-18 23:33:33

+2

問:什麼更好?答:「巧克力」。巧克力*顯然*比「草莓」更好;)恕我直言... – paulsm4 2012-07-18 23:34:40

回答

4

答案是:「在最低的級發現異常,知道如何處理它。」

1

沒有規則關於哪一個更好。你可以使用這兩種方法。這筆交易是你需要在try以內最有可能拋出異常的代碼,這適用於所有編程語言。

0

假設發生下一件事:

您希望每個失敗的有效消息。

public void Main() 
{ 
    try 
    { 
     SomeMethod(); 
    } 
    catch(Exception) 
    { 
    } 
} 

上面會提供的信息較少,比捕捉每個trySomeMethod(),所以即使是這樣也沒有什麼區別,我會建議,可以捕獲失敗,以提供有關錯誤的原因有用的數據小動作。

0

在我看來,你趕上的someMethod異常不言而喻上方,可能會丟失,由於沒有直接的代碼的可見性對眼睛

一個非常重要的事情就是請儘量捕捉特定異常第一,而不是任何東西之前

eg

如果的someMethod做一些字符串到數字的轉換,然後先嚐試趕上出現FormatException,把Exception類爲別的

2

有一個想法,你應該抓住最接近例外,它們發生在哪裏(即高儘可能/適當地調用調用堆棧)。一攬子異常處理程序通常不是一個好主意,因爲它極大地減少了可用的控制流。粗粒度異常處理非常重要,但不是程序穩定性的合理解決方案。不幸的是,許多初學者開發者認爲它是這樣,並採取諸如此類的try-catch語句的方法。如果您已在程序的其餘部分中正確使用異常處理(以細粒度和特定於任務的方式),並相應地在那裏處理錯誤(而不是僅顯示通用錯誤框),那麼對Main方法中所有異常的一般嘗試捕獲可能是有用的。這裏需要注意的一點是,如果你在這個主try-catch中收到錯誤,那麼你的錯誤或者是你的本地異常處理有問題。

這個嘗試與主要用法的主要用途,純粹是爲了防止你的程序在非常不尋常的情況下崩潰,並應該做的僅僅是顯示一個(模糊的)用戶友好的「致命錯誤」用戶或只是留空,以及可能在某處記錄錯誤和/或提交錯誤報告。

學分:Noldorin

0

我認爲,定製會扔在最低水平更容易理解異常的最好方法。

先定義你的自定義異常類

public class SomeException : Exception {} 

public void SomeMethod() 
{ 
    try 
    { 
    // code 
    } 
    catch(Exception e) 
    { 
     throw new SomeException ("an error in somemethod",e); 
    } 
} 

現在,你將在任何地方捕獲更多的清晰異常。

2

有關C#中異常處理的指導,請參閱Exceptions and Exception Handling (C# Programming Guide)This interview與安德斯Hejlsberg也是資料。這裏

相關的指導方針是:

不要捕捉異常,除非你可以處理它,並在已知狀態下退出程序。

通常,除非能正確處理,否則不應該發現異常。這可能是MainSomeMethod,這取決於編碼的內容。例如,Main可能包含一個通用的catch語句來處理一般異常(例如,向控制檯寫入錯誤消息);但SomeMethod可能能夠從某些例外中恢復並捕獲這些例外。

一般情況下,應避免catch {}(吞嚥異常);一個不能處理異常的調用者應該簡單地允許它向上傳播。