【发布时间】:2014-10-30 12:26:18
【问题描述】:
当抛出异常时,会启动堆栈展开,直到遇到处理代码,但我对整个过程的机制有点不清楚。
1 - 异常存储在哪里?我不是指实际的异常对象,它可能很大,例如有一个消息字符串或其他东西,但如果你愿意的话,是实际的引用或指针。它必须是某个统一的存储位置,这样它才能在堆栈展开并到达处理位置时保持下来?
2 - 程序流如何确定它是否必须展开特定的函数框架并调用与程序计数器指示的位置相关的适当析构函数,或者在进一步展开之前寻求异常处理?
3 - 如何在抛出的内容和正在发生的异常之间进行实际检查?
我知道答案可能包括特定于平台的内容,在这种情况下,我们将不胜感激。不过,无需超越 x86/x64 和 ARM。
【问题讨论】:
-
所有问题都有完全特定于实现的答案,特别是对于 Linux/GCC 构建和 32 位 Microsoft Windows 构建有非常不同的答案。
-
但供参考:这里是标准Linux C++ ABI异常处理机制的描述。请注意,ARM 略有不同。 mentorembedded.github.io/cxx-abi/abi-eh.html
-
@SebastianRedl - 只要它们提供信息,我对不同的答案没有问题。我将不胜感激任何内容丰富的答案,无论它解决的是哪种实现。
-
问题是,我认为这在某种程度上违反了指导方针。
-
@SebastianRedl - 询问具体实施问题是否违反指南?或者也许问“多实现”问题?如果是后者 - 为每个实现提出相同的问题真的会更好吗?
标签: c++ exception exception-handling implementation