在引发异常时是否有跳过catch块的情况 说
try
{
some code
}
catch(Exception ex)
{
some code
}
我正在使用Exception类,因为它捕获了所有异常。
答案 0 :(得分:10)
StackOverflowException
可能会遇到问题(请参阅List of exceptions that CAN'T be caught in .NET)
还有另一个案例系列,特别是当抛出的东西不是Exception
时,但这只有在你是1.1或者没有自动异常的情况下包装已启用(默认情况下从2.0启用) - 从理论上讲,C ++可以抛出任何(而不仅仅是Exception
),所以如果你的“某些代码”调用某些C ++例如,抛出一个string
,然后理论你可能会错过它。
实际上,这很少(如果有的话)是一个真正的问题:
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使用高资源,因此建议仅在您确定可能发生何种异常时才使用它。