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

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

我知道异常会向上传播。


当前回答

快速(相当明显的)代码片段保存“原始异常”(在try块中抛出)并牺牲“finally异常”(在finally块中抛出),以防原始异常对你更重要:

try
{
    throw new Exception("Original Exception");
}
finally
{
    try
    {
        throw new Exception("Finally Exception");
    }
    catch
    { }
}

当执行上面的代码时,“原始异常”向上传播调用堆栈,“最终异常”丢失。

其他回答

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

该异常向外和向上传播,并且将(可以)在更高的级别进行处理。

finally块在抛出异常之后将不会完成。

如果finally块是在处理之前的异常期间执行的,那么第一个异常将丢失。

c# 4语言规范§8.9.5:如果finally块抛出另一个异常,则当前异常的处理将终止。

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

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

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

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

传播异常。

快速(相当明显的)代码片段保存“原始异常”(在try块中抛出)并牺牲“finally异常”(在finally块中抛出),以防原始异常对你更重要:

try
{
    throw new Exception("Original Exception");
}
finally
{
    try
    {
        throw new Exception("Finally Exception");
    }
    catch
    { }
}

当执行上面的代码时,“原始异常”向上传播调用堆栈,“最终异常”丢失。