【问题标题】:Clarification on Exception handling异常处理说明
【发布时间】:2011-01-25 10:12:02
【问题描述】:

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

这是正确的吗?我搜索了高低,找不到任何与此一致的信息?我说的有什么不准确之处吗?

【问题讨论】:

    标签: .net winforms exception exception-handling


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我知道的最好的来源是 CLI 规范。不过读起来有点干。 ecma-international.org/publications/standards/Ecma-335.htm
      • 这是不正确的。这不是为什么异常处理很重要。你不应该处理你无能为力的异常。在大多数情况下,如果您可以对异常采取一些措施,这表明您正在使用它进行流量控制,而您一开始就不应该这样做。应该为真正的异常条件保留异常,您可能无法能够处理,并且应该冒泡甚至导致程序崩溃如有必要。
      • @Cody 没错,你不应该使用异常处理来进行流控制,也不应该捕获你不会做任何事情的异常。但是,您可能希望程序的不同层/类处理它们自己的异常,并可能在抛出更高级别的自定义处理程序之前包装它们。
      • @El Ronnoco:也许,但这样做的风险是您会丢失有价值的调用堆栈信息。每次捕获并重新抛出异常时,堆栈都会在 catch 子句执行时展开。我想这取决于你的类库的设计,但要牢记这一点。
      • @Road:这远非完美的解决方案。并且绝对没有理由首先捕获并重新抛出捆绑的异常,除非您正在实现某种自定义异常日志记录功能。至于您的论点,即例外不仅仅针对例外情况……嗯?是的,我认为“使用错误、程序错误和系统故障”全部都符合“例外情况”。你把这些东西统称为什么?关键是,异常应该是不常见不寻常的事情。除非您有充分的理由捕获异常,否则不要。
      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多