异常发生后执行从哪里恢复?

6 投票
5 回答
8066 浏览
提问于 2025-04-15 17:21

一般来说,当程序出现异常并被捕获后,程序的执行会从哪里继续呢?是从抛出异常的那行代码后面继续,还是从捕获异常的地方继续?另外,这种行为在大多数编程语言中是一致的吗?

5 个回答

2

程序在捕获异常的地方会继续执行,也就是在“catch”块里。
这一点在使用异常处理的编程语言中都是一样的。

需要特别注意的一点(尤其是在C++中)是,
在“throw”(抛出异常)和“catch”(捕获异常)之间,程序会有序地清理堆栈上的内容,确保所有在堆栈上创建的对象都能按照预期的顺序被正确销毁。这就是我们所说的RAII技术。

7

在catch块里的代码会被执行,之后程序会继续在catch块后面的位置运行。

4

当程序遇到错误时,它会在捕获到这个错误的地方继续执行,也就是在对应的 catch 块的开头。这个 catch 块会处理当前的错误,而其他的 catch 块会被忽略(可以把多个 catch 块想象成一个选择语句)。在某些编程语言中,catch 之后还可能会有一个 finally 块,这个块会在 catch 之后执行。然后程序会继续执行 try ... catch ... finally ... 之后的下一条指令。

需要注意的是,如果一个错误没有在某个块中被捕获,它会向上抛给调用当前函数的地方,直到有一个 catch 块处理这个错误。在这种情况下,你可以把函数调用想象成一个宏:把每个函数的代码插入到它被调用的地方,这样你就能清楚地看到每个 try .. catch ... finally ... 块是如何嵌套的。

如果没有处理这个错误的地方,程序通常会崩溃。(不过有些编程语言在这方面可能会有所不同。)

我知道的每种语言在执行流程上都是一致的,唯一的区别在于 try ... catch ... finally ... 的结构:并不是每种语言都有 finally,有些语言不允许在同一个块中同时使用 finallycatch(你需要嵌套两个 try 来使用这两个),而有些语言则允许捕获所有错误(比如 C++ 中的 catch (...)),而有些语言则不允许。

撰写回答