在try / catch / finally块中,如:
try
{
}
catch()
{
// code fails here
}
finally
{
}
因此,如果catch块中有异常,最终会被调用吗?
如果没有最终结果,catch块之后的代码会运行吗?
答案 0 :(得分:25)
假设进程没有突然终止(或挂起,当然),finally块将始终执行。
如果没有finally块,catch块中的异常将被抛出堆栈。请注意,导致catch块首先执行的原始异常将被有效丢失。
堆栈溢出异常
正如Jared所指出的,堆栈溢出将导致finally块不被执行。我相信这会突然终止程序,但我可能错了。这是示例代码:
using System;
public class Test
{
static void Main()
{
// Give the stack something to munch on
int x = 10;
try
{
Main();
Console.WriteLine(x);
}
finally
{
Console.WriteLine("Finally");
}
}
}
结果:
由于StackOverflowException,进程终止。
答案 1 :(得分:6)
finally块将始终执行。如果排除finally块,并且catch块内发生异常,那么catch块之后就不会执行任何代码,因为基本上你的catch块会失败并自己生成一个未处理的异常。
答案 2 :(得分:6)
是的,最终将永远运行
不会运行catch块之后的代码。
即使使用finally块,finally块后面的任何代码都不会运行。
答案 3 :(得分:4)
如果catch块中有异常,则finally将执行,但会抛出一个新异常。发生异常的catch块不会捕获异常,它将继续向上堆栈。
获得的经验教训:如果你可以帮助它,不要在捕获块中做任何事情;如果必须,嵌套一个try / catch块。
try
{
}
catch()
{
try
{
// code fails here
}
catch
{
// handle that. Or not.
}
}
finally
{
}
答案 4 :(得分:1)
将始终执行finally块。来自MSDN:
finally块对于清理try块中分配的任何资源以及运行任何必须执行的代码(即使存在异常)也很有用。无论try块如何退出,控制总是传递给finally块。
尽管catch用于处理语句块中发生的异常,但最终用于保证语句代码块的执行,而不管前面的try块是如何退出的。
顺便说一句,这是一种问题,您可以通过编写一些代码,编译代码并查看执行代码时可以轻松测试自己的问题。
class Program {
static void Main(string[] args) {
try {
Console.WriteLine("Trying!");
throw new Exception();
}
catch (Exception e) {
Console.WriteLine("Catching {0}!", e.Message);
throw new Exception();
}
finally {
Console.WriteLine("Finally!");
}
}
}
输出:
Trying!
Catching Exception of type 'System.Exception' was thrown.!
Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at TestFinally.Program.Main(String[] args) in C:\Documents and Settings\Me\My
Documents\Visual Studio 2008\Projects\TestFinally\TestFinally\Program.cs:line 15
Finally!
Press any key to continue . . .
答案 5 :(得分:0)
如果catch块中发生异常,则finally中的所有代码仍将被执行。 如果堆栈中有一个异常处理程序(例如此函数的调用者),它将捕获此异常。否则会导致未处理的异常并将您的应用程序关闭。
catch块中异常点之后的代码不会被调用。
答案 6 :(得分:0)
只是想添加我知道的不允许finally和任何其他代码块执行的情况: