一般情况下,抛出并捕获异常后程序执行在哪里恢复?它会在抛出异常的代码行之后恢复,还是在它被捕获的地方继续?此外,这种行为在大多数编程语言中是否一致?
答案 0 :(得分:7)
执行catch块内的代码,并在catch块之后继续执行原始执行。
答案 1 :(得分:3)
执行将在捕获异常的地方重新开始,即catch
块的开头,它专门解决当前的异常类型。执行catch块,忽略其他catch块(将多个catch
块视为switch语句)。在某些语言中,finally
块也可以在catch
之后执行。然后程序继续执行整个try ... catch ... finally ...
之后的下一条指令。
您应该注意,如果未在块中捕获异常,则异常将传播到当前函数的调用方,并向上传递调用堆栈,直到catch
处理异常。在这种情况下,您可以将函数调用视为宏:插入调用它的每个函数的代码,您将清楚地看到每个try .. catch ... finally ...
块的嵌套。
如果没有异常处理程序,程序通常会崩溃。 (在这一点上,某些语言可能有所不同)。
执行流程的行为与我所知道的每种语言都是一致的。唯一的区别在于try ... catch ... finally ...
构造:finally
在每种语言中都不存在,某些语言不允许同一块中的finally
和catch
(您必须嵌套两个try
才能使用2),有些语言可以捕获所有内容(C ++中的catch (...)
),而某些语言则不然。
答案 2 :(得分:2)
执行在catch块中继续执行(捕获异常的位置) 这在使用异常的语言中是一致的。
需要注意的重点(特别是在C ++中)
在throw和catch点之间,堆栈以有序的方式展开,以便在堆栈上创建的所有对象都被正确销毁(按预期的顺序)。这导致该技术被称为RAII。
答案 3 :(得分:2)
我没有Bjarne Stroustrup的“Design& Evolution”副本,但我相信他在那里写了一些关于可恢复异常的经验。他们发现他们让事情变得更加难以正确。毕竟,如果在某行中发生意外错误,那么您的异常处理程序必须充分修补问题,以便在不知道上下文的情况下继续执行。对于内存不足错误,这可能是可能的(虽然这种错误通常是内存分配失控的结果,添加更多内存并不会真正解决任何问题),但一般不会出现异常。
因此,在C ++和我熟悉的所有语言中,执行将以catch返回,并且不会自动返回到抛出异常的位置。
答案 4 :(得分:1)
它会在异常被捕获的地方恢复。否则,编写异常条款的重点是什么?