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

时间:2009-02-24 15:03:29

标签: .net exception-handling

在try / catch / finally块中,如:

try
{

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

}

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

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

7 个答案:

答案 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和任何其他代码块执行的情况:

  • 如果发生运行时抛出StackOverflowException
  • System.Environment.FastFail
  • Environment.Exit
  • 如果“后台”线程因主程序而终止 它所属的是结束。
  • 意外关闭:)