异常处理:抛出后最终执行?

时间:2009-10-16 09:20:15

标签: .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

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

[编辑] 谢谢你的快速回答。

在第一行中我会想到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

一切顺利!

的Inno

5 个答案:

答案 0 :(得分:25)

  

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

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

如果您确实需要Catch块然后重新抛出异常,请使用以下命令:

Catch e As XyzException
    ' … do some stuff. '
    Throw
End Try

1):警告:有一些例外,例如StackOverflowException(如何拟合......),需要特别注意,并且可能不会触发Finally块。正确处理它们通常很困难。

答案 1 :(得分:5)

不,不保证能够运行。有一些例外 - 例如StockOverflowException和OutOfMemoryException - 其中不保证执行finally块。

答案 2 :(得分:1)

在几乎所有情况下,finally都将在Try / Catch块中执行(值得注意的例外,包括发生StackOverflowException或OutOfMemoryException时)。我很好奇,为什么你没有为自己尝试这个。学习事物的一个有价值的方法就是实际上为自己试一试 - 毕竟,你最终可能会接受一个错误或误导的答案,并且从那时起你就会在这种虚假的情况下进行劳动。

答案 3 :(得分:1)

注意:System.Environment.FastFail方法是立即杀死当前进程/线程,没有最后执行部分。

答案 4 :(得分:0)

是的,最终在任何情况下执行。 (只有少数例外 - Response.Redirect和一些多线程的情况)