在.NET中,如果catch块中的某些内容失败,最终会被调用吗?

Bla*_*man 16 .net exception-handling

在try/catch/finally块中,例如:

try
{

}
catch()
{
   // code fails here
}
finally
{ 

}
Run Code Online (Sandbox Code Playgroud)

所以如果catch块中有异常,最终会被调用吗?

如果没有最终的话,catch块之后的代码会运行吗?

Jon*_*eet 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");
        }
    }  
}
Run Code Online (Sandbox Code Playgroud)

结果:

由于StackOverflowException,进程终止.

  • 我相信真正的Stack Overflow异常也可以阻止最终运行.虽然我无法找到这方面的文档. (2认同)

Jos*_*eph 6

finally块将始终执行.如果排除finally块,并且catch块内发生异常,那么catch块之后的代码就不会执行,因为基本上你的catch块会失败并自己生成一个未处理的异常.


Ant*_*nes 6

是的,终于将永远运行

不会运行catch块之后的代码.

即使使用finally块,finally块之后的任何代码都不会运行.