如果finally块抛出异常,到底会发生什么?
具体来说,如果在finally块中途抛出异常会发生什么。这个块中的其余语句(之后)是否被调用?
我知道异常会向上传播。
如果finally块抛出异常,到底会发生什么?
具体来说,如果在finally块中途抛出异常会发生什么。这个块中的其余语句(之后)是否被调用?
我知道异常会向上传播。
当前回答
如果有一个异常挂起(当try块有finally但没有catch时),新异常将替换该异常。
如果没有异常挂起,它就像在finally块外抛出异常一样工作。
其他回答
在另一个异常活动时抛出异常将导致第一个异常被第二个(稍后)异常所取代。
下面是一些代码,说明发生了什么:
public static void Main(string[] args)
{
try
{
try
{
throw new Exception("first exception");
}
finally
{
//try
{
throw new Exception("second exception");
}
//catch (Exception)
{
//throw;
}
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
运行代码,您将看到“第二个异常” 取消try和catch语句的注释,您将看到“第一个异常” 也取消注释抛出;语句,您将再次看到“第二个异常”。
如果有一个异常挂起(当try块有finally但没有catch时),新异常将替换该异常。
如果没有异常挂起,它就像在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子句中捕获该异常。