澄清异常处理

时间:2011-01-25 10:12:02

标签: .net winforms exception exception-handling

我的理解是,当抛出Exception时,它会冒出调用堆栈直到它被处理(在try / catch块中)并且如果这种情况永远不会发生,那么异常最终会到达目的地到达Program.Main()并且如果仍未处理则被运行时视为“未处理的异常”。

这是对的吗?我搜索过高低,找不到任何与此相符的信息?我所说的任何不准确之处?

3 个答案:

答案 0 :(得分:7)

  

我的理解是,当抛出异常时,它会冒出调用堆栈直到它被处理(在try / catch块中)并且如果这种情况从未发生过,异常最终会到达Program.Main ()如果仍未处理,则被运行时视为“未处理的异常”。

您的描述虽然本身并不准确,但却极不完整;你没有描述以下情况会发生什么:

  • 终于阻止了
  • 故障块
  • 使用过滤器捕获块

请注意,C#语言不会公开最后两个CLR功能,但它们仍然存在。

这三种情况加上普通捕获块的控制流程可能相当复杂。

如果您想更全面地了解其工作原理,我建议您仔细阅读Christopher Brumme关于此主题的详细文章:

http://blogs.msdn.com/b/cbrumme/archive/2003/10/01/51524.aspx

答案 1 :(得分:2)

是的,这是正确的。这就是异常处理很重要的原因。

有关异常的有趣内容:http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx

答案 2 :(得分:2)

  

我的理解是,当抛出异常时,它会冒出调用堆栈直到它被处理(在try / catch块中)并且如果这种情况从未发生过,异常最终会到达Program.Main ()如果仍未处理,则被运行时视为“未处理的异常”。

除了在catch区块内处理例外情况外,在以下情况下例外情况不会达到Program.Main()(并且不包括断电等情况)

  • 如果finally块抛出异常,则原始异常将不再被传播。
  • 如果异常是由主线程以外的线程引发的,那么它将成为“未处理的异常”而不会到达Program.Main()。 (在较新版本的.NET运行时中。)