2012-03-19 61 views
2

是否有一個地方時,將引發異常的catch塊被跳過任何情況下 說行爲catch塊時引發異常

try 
{ 
    some code 
} 
catch(Exception ex) 
{ 
    some code 
} 

我使用的異常類,因爲它捕獲所有異常。

+0

**異常處理程序塊中的某些代碼**也可能會丟失。也許這是造成問題。 – 2012-03-19 10:40:13

回答

10

你可能會遇到一些問題StackOverflowException(見List of exceptions that CAN'T be caught in .NET

有情況的另一個家庭,特別是當事情拋出不是一個Exception,但這只是如果你無論是在1.1,或者沒有啓用自動異常包裝(默認情況下從2.0開啓) - 理論上C++可以拋出任何東西(不僅僅是Exception),所以如果你的「某些代碼」調用某些拋出的C++,說,string,然後理論上你可能會想念它。

在現實中,這是很少(如果有的話),一個現實的問題:

  • 自動換行默認情況下啓用
  • 大多數C++代碼交談.NET拋出Exception(或子類)是很好-behaved

在這種情況下,一個catch { ... }將努力攔截的東西被拋出,但不會告訴你什麼發生

0

它不應該跳過,因爲所有異常都是從Exception類派生的。 你有沒有發生過其他方式的情況?

1

如果CLR出現異常(例如堆棧溢出) - 它不會捕獲該異常。

但是,對於正常的例外情況,你會抓住一切。

2

所有例外都有Exception作爲基本類型。如果try塊中的代碼導致異常,則會導致catch匹配類型塊中的代碼被執行。 如果您也有相匹配的更具體的catch塊,該塊將被執行:

try 
{ 
    throw new FileNotFoundException(); 
} 
catch (FileNotFoundException) 
{ 
    // this code will run 
} 
catch (Exception) 
{ 
    // this won't (but will if a different exception is thrown) 
} 

如果catch塊中的代碼會導致Exception,它會離開catch塊,找到一個「父」 catch塊匹配。

請注意,只有當前線程的異常被捕獲 - 如果您在try塊內啓動並等待異步操作,則可能無法在等待的線程上捕獲它們。

0
try 
{ 
    //some code 
} 
catch(System.DivideByZeroException dbz) 
{ 
    //Divide by Zero exception catched 
} 
catch(Exception ex) 
{ 
    //some code 
} 

您已給出Exception類,它是所有異常的基類。所以你需要給出特定的Exception類,例如ArgumentNotFound Exception。

如果您不想捕捉任何異常,請將其留空。 但請注意,使用Try..Catch阻止使用高資源,所以建議僅在確定可能發生什麼樣的異常時使用它。

2

正如Marc指出的,有幾個例外是無法捕獲的 - 例如,StackOverflowException。

在.NET 4中,存在損壞狀態異常的概念,用於指示未傳遞到託管代碼的異常,除非代碼明確表示有興趣處理它們。這些異常(例如AccessVoilationException)表示嚴重的編程錯誤,並且通常不保證發生時的一致的內存/編程狀態。有關更多信息,請參見此優秀文章:http://msdn.microsoft.com/en-us/magazine/dd419661.aspx