是否有一個地方時,將引發異常的catch塊被跳過任何情況下 說行爲catch塊時引發異常
try
{
some code
}
catch(Exception ex)
{
some code
}
我使用的異常類,因爲它捕獲所有異常。
是否有一個地方時,將引發異常的catch塊被跳過任何情況下 說行爲catch塊時引發異常
try
{
some code
}
catch(Exception ex)
{
some code
}
我使用的異常類,因爲它捕獲所有異常。
你可能會遇到一些問題StackOverflowException
(見List of exceptions that CAN'T be caught in .NET)
有情況的另一個家庭,特別是當事情拋出不是一個Exception
,但這只是如果你無論是在1.1,或者沒有啓用自動異常包裝(默認情況下從2.0開啓) - 理論上C++可以拋出任何東西(不僅僅是Exception
),所以如果你的「某些代碼」調用某些拋出的C++,說,string
,然後理論上你可能會想念它。
在現實中,這是很少(如果有的話),一個現實的問題:
Exception
(或子類)是很好-behaved在這種情況下,一個catch { ... }
將努力攔截的東西被拋出,但不會告訴你什麼發生。
它不應該跳過,因爲所有異常都是從Exception類派生的。 你有沒有發生過其他方式的情況?
如果CLR出現異常(例如堆棧溢出) - 它不會捕獲該異常。
但是,對於正常的例外情況,你會抓住一切。
所有例外都有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
塊內啓動並等待異步操作,則可能無法在等待的線程上捕獲它們。
try
{
//some code
}
catch(System.DivideByZeroException dbz)
{
//Divide by Zero exception catched
}
catch(Exception ex)
{
//some code
}
您已給出Exception
類,它是所有異常的基類。所以你需要給出特定的Exception類,例如ArgumentNotFound
Exception。
如果您不想捕捉任何異常,請將其留空。 但請注意,使用Try..Catch
阻止使用高資源,所以建議僅在確定可能發生什麼樣的異常時使用它。
正如Marc指出的,有幾個例外是無法捕獲的 - 例如,StackOverflowException。
在.NET 4中,存在損壞狀態異常的概念,用於指示未傳遞到託管代碼的異常,除非代碼明確表示有興趣處理它們。這些異常(例如AccessVoilationException)表示嚴重的編程錯誤,並且通常不保證發生時的一致的內存/編程狀態。有關更多信息,請參見此優秀文章:http://msdn.microsoft.com/en-us/magazine/dd419661.aspx
**異常處理程序塊中的某些代碼**也可能會丟失。也許這是造成問題。 – 2012-03-19 10:40:13