如果finally块抛出异常,到底会发生什么?

具体来说,如果在finally块中途抛出异常会发生什么。这个块中的其余语句(之后)是否被调用?

我知道异常会向上传播。


当前回答

public void MyMethod()
{
   try
   {
   }
   catch{}
   finally
   {
      CodeA
   }
   CodeB
}

CodeA和CodeB抛出的异常的处理方式是相同的。

finally块中抛出的异常没有任何特殊含义,将其视为代码B抛出的异常。

其他回答

如果有一个异常挂起(当try块有finally但没有catch时),新异常将替换该异常。

如果没有异常挂起,它就像在finally块外抛出异常一样工作。

public void MyMethod()
{
   try
   {
   }
   catch{}
   finally
   {
      CodeA
   }
   CodeB
}

CodeA和CodeB抛出的异常的处理方式是相同的。

finally块中抛出的异常没有任何特殊含义,将其视为代码B抛出的异常。

异常向上传播,应该在更高的级别进行处理。如果不在更高的级别处理异常,应用程序将崩溃。“finally”块执行在抛出异常的地方停止。

无论是否存在异常,“finally”块都保证执行。

如果“finally”块在try块中发生异常后被执行, 如果这个异常没有被处理 如果finally块抛出异常

然后,try块中发生的原始异常将丢失。

public class Exception
{
    public static void Main()
    {
        try
        {
            SomeMethod();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    public static void SomeMethod()
    {
        try
        {
            // This exception will be lost
            throw new Exception("Exception in try block");
        }
        finally
        {
            throw new Exception("Exception in finally block");
        }
    }
} 

关于细节的好文章

传播异常。

它抛出一个异常;)您可以在其他catch子句中捕获该异常。