引发异常时Catch Block的行为

时间:2012-03-19 10:31:07

标签: c# .net exception-handling

在引发异常时是否有跳过catch块的情况 说

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

我正在使用Exception类,因为它捕获了所有异常。

6 个答案:

答案 0 :(得分:10)

StackOverflowException可能会遇到问题(请参阅List of exceptions that CAN'T be caught in .NET

还有另一个案例系列,特别是当抛出的东西不是Exception 时,但这只有在你是1.1或者没有自动异常的情况下包装已启用(默认情况下从2.0启用) - 从理论上讲,C ++可以抛出任何(而不仅仅是Exception),所以如果你的“某些代码”调用某些C ++例如,抛出一个string,然后理论你可能会错过它。

实际上,这很少(如果有的话)是一个真正的问题:

  • 默认启用自动换行
  • 与.NET交谈的大多数C ++代码抛出Exception(或子类)以表现良好

在这种情况下,catch { ... }会拦截投掷的内容,但不会告诉你发生了什么

答案 1 :(得分: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块并找到" parent"匹配的catch块。

请注意,只捕获当前线程上的异常 - 如果您在try块中启动并等待异步操作,则可能无法在等待的线程上捕获它们。

答案 2 :(得分:2)

正如Marc指出的那样,很少有异常无法捕获 - 例如,StackOverflowException。

使用.NET 4时,存在损坏的状态异常的概念,以指示未传递给托管代码的异常,除非代码明确表示有兴趣处理它们。这些异常(例如AccessVoilationException)表示严重的编程错误,并且通常不保证发生时的一致内存/程序状态。有关详细信息,请参阅此优秀文章:http://msdn.microsoft.com/en-us/magazine/dd419661.aspx

答案 3 :(得分:1)

如果CLR存在异常(例如堆栈溢出) - 它将不会捕获该异常。

但是对于正常的例外情况,你会抓住一切。

答案 4 :(得分:0)

它不应该跳过,因为所有异常都是从Exception类派生的。 你有任何其他方式发生的事情吗?

答案 5 :(得分:0)

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

您已经提供了Exception类,它是所有异常的基类。因此,您需要提供特定的Exception类,如ArgumentNotFound例外。

如果您不想捕获任何异常,请将其留空。 但请记住一件事,使用Try..Catch Block使用高资源,因此建议仅在您确定可能发生何种异常时才使用它。