2010-08-24 250 views
1

是你指定要趕上哪些異常異常捕獲

try 
{ 
    ... 
} 
catch (NHibernate.ADOException exception) 
{} 

try 
{ 
    ... 
} 
catch (exception ex) 
{} 
+3

後者將不會編譯,除非您碰巧有一個名爲'exception'的類型。 – Joey 2010-08-24 10:40:14

回答

6

之間的差別在catch塊。因此,如果你有

try {} 
catch(Exception e){} 

它會捕獲從Exception類派生的所有異常(因此所有例外)。如果您有:

try{} 
catch (NHibernate.ADOException exception){} 

它只會捕獲ADOException或從ADOException派生的異常。所以如果你得到一個ArgumentException,它會通過,就好像沒有try/catch一樣。

+0

另外如果你期待指定的異常,它是一個很好的習慣,趕上它的實際類型,然後'異常'類型。在這種情況下,使用'NHibernate.ADOException'是更好的解決方案 – 2010-08-24 10:42:54

1

我假設你的意思

catch (Exception ex) {} 

與第二片段。

然後區別在於第一個將只捕獲一個特定類型的異常,即NHibernate.ADOException,而第二個將會進入catch塊以查找可能拋出的所有異常。

第二個通常是不好的做法,因爲你聲稱處理所有可能的錯誤類型。但是,在最外層的範圍內,對於任何通過的異常來說,它都是有意義的。

0

強烈不建議使用catch {Exception},因爲這實際上隱藏了一個錯誤。在可能引發異常的每個地方,都需要捕獲預期的異常類型,即使這需要編寫更多的代碼行。當引發意外的異常時,程序必須崩潰,這是解決該錯誤的唯一方法。