如果在由异常引起的堆栈展开期间,C++ 中的析构函数抛出异常,则程序将终止。 (这就是为什么析构函数永远不应该在 C++ 中抛出。)示例:
struct Foo
{
~Foo()
{
throw 2; // whoops, already throwing 1 at this point, let's terminate!
}
};
int main()
{
Foo foo;
throw 1;
}
terminate called after throwing an instance of 'int'
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
如果由于相应的 try 块中出现异常而在 Java 中进入了finally 块,并且该finally 块抛出了第二个异常,则第一个异常将被默默地吞掉。例子:
public static void foo() throws Exception
{
try
{
throw new Exception("first");
}
finally
{
throw new Exception("second");
}
}
public static void main(String[] args)
{
try
{
foo();
}
catch (Exception e)
{
System.out.println(e.getMessage()); // prints "second"
}
}
我想到了这个问题:编程语言可以处理同时抛出的多个异常吗?那会有用吗?你有没有怀念过这个能力?有没有一种语言已经支持这个?有这样的做法的经验吗?
有什么想法吗?
从流量控制的角度思考。例外从根本上来说只是幻想setjmp
/longjmp
or setcc
/callcc
反正。异常对象用于选择要跳转到的特定位置,例如地址。异常处理程序只是对当前异常进行递归,longjmp
荷兰国际集团直到它被处理。
一次处理两个异常只需将它们捆绑在一起即可,这样结果就可以产生连贯的流量控制。我可以想到两种选择:
- 将它们组合成一个无法捕获的异常。这相当于展开整个堆栈并忽略所有处理程序。这会产生异常级联导致完全随机行为的风险。
- 以某种方式构建他们的笛卡尔积。是的,对。
C++ 方法很好地满足了可预测性的需求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)