异常后执行在哪里恢复?

时间:2009-12-25 13:20:12

标签: c++ python exception

一般情况下,抛出并捕获异常后程序执行在哪里恢复?它会在抛出异常的代码行之后恢复,还是在它被捕获的地方继续?此外,这种行为在大多数编程语言中是否一致?

5 个答案:

答案 0 :(得分:7)

执行catch块内的代码,并在catch块之后继续执行原始执行。

答案 1 :(得分:3)

执行将在捕获异常的地方重新开始,即catch块的开头,它专门解决当前的异常类型。执行catch块,忽略其他catch块(将多个catch块视为switch语句)。在某些语言中,finally块也可以在catch之后执行。然后程序继续执行整个try ... catch ... finally ...之后的下一条指令。

您应该注意,如果未在块中捕获异常,则异常将传播到当前函数的调用方,并向上传递调用堆栈,直到catch处理异常。在这种情况下,您可以将函数调用视为宏:插入调用它的每个函数的代码,您将清楚地看到每个try .. catch ... finally ...块的嵌套。

如果没有异常处理程序,程序通常会崩溃。 (在这一点上,某些语言可能有所不同)。

执行流程的行为与我所知道的每种语言都是一致的。唯一的区别在于try ... catch ... finally ...构造:finally在每种语言中都不存在,某些语言不允许同一块中的finallycatch(您必须嵌套两个try才能使用2),有些语言可以捕获所有内容(C ++中的catch (...)),而某些语言则不然。

答案 2 :(得分:2)

执行在catch块中继续执行(捕获异常的位置) 这在使用异常的语言中是一致的。

需要注意的重点(特别是在C ++中)
在throw和catch点之间,堆栈以有序的方式展开,以便在堆栈上创建的所有对象都被正确销毁(按预期的顺序)。这导致该技术被称为RAII。

答案 3 :(得分:2)

我没有Bjarne Stroustrup的“Design& Evolution”副本,但我相信他在那里写了一些关于可恢复异常的经验。他们发现他们让事情变得更加难以正确。毕竟,如果在某行中发生意外错误,那么您的异常处理程序必须充分修补问题,以便在不知道上下文的情况下继续执行。对于内存不足错误,这可能是可能的(虽然这种错误通常是内存分配失控的结果,添加更多内存并不会真正解决任何问题),但一般不会出现异常。

因此,在C ++和我熟悉的所有语言中,执行将以catch返回,并且不会自动返回到抛出异常的位置。

答案 4 :(得分:1)

它会在异常被捕获的地方恢复。否则,编写异常条款的重点是什么?