.net - 异常处理 : Is finally executed after throw?

标签 .net vb.net exception-handling

假设您有以下代码:

而不是这样做:

Try
    '
    ' Initialize some objects
    '

    '
    ' do something that fails
    '

    '
    ' Clean up-code that gets not reached because exception
    '
Catch e As Exception
    '
    'Clean up initialized objects
    '

    Throw e
End Try

我想要做:
Try
    '
    ' Initialize some objects
    '

    '
    ' do something that fails
    '
Catch e As Exception
    Throw e
Finally
    '
    'Clean up initialized objects
    '
End Try

所以我的简单问题是:如果出现异常,即使之前有 throw 一些行,是否也会到达 finally block ?

[编辑]
感谢您的快速答复。

我认为在第一行会有 NullReference-、COM- 和 FileNotFound-Exceptions。

好的,我将使用此代码:
Try
    '
    ' Initialize some objects
    '

    '
    ' do something that fails
    '
Catch e As Exception      ' or just "Catch"??        
    Throw
Finally
    '
    'Clean up initialized objects
    '
End Try

祝一切顺利!

英诺

最佳答案

So my simple question is: In case of an exception is the finally block reached even if there is a throw some lines before?



是的。 Finally block总是1) 被执行并且精确地存在以进行清理。在您的代码中,删除 Catch block ,它什么都不做。更糟糕的是,它实际上破坏了堆栈跟踪,因为您没有重新抛出原始异常,而是抛出了一个新异常。

如果您真的需要 Catch然后重新抛出异常的 block ,使用以下内容:
Catch e As XyzException
    ' … do some stuff. '
    Throw
End Try

1): 警告购买者:有一些异常(exception),例如 StackOverflowException (多么合适……)需要特别注意并且可能不会触发Finally堵塞。正确处理它们通常非常困难。

关于.net - 异常处理 : Is finally executed after throw?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577049/

相关文章:

java - 如何获取导致 NumberFormatException 的文本字段?

c# - 如何在不修改类的情况下添加XML序列化指令

.net - .NET 4 中的混合模式程序集

c# - 将图像转换为 base64,反之亦然

.net - 使用 nHibernate 将未映射的数据转换为 DTO

asp.net - 如何在 asp.net 中制作仅包含顶级元素的基于站点地图的菜单?

c# - 可以单声道运行 framework.net 编译的应用程序(来自 VS 环境)

c++ - 使用 Qt5 的 throw 语句即时崩溃

scala - 如何捕获异常并重定向到 Lift 中的错误页面?

c# - 在运行时添加新页面