gpt4 book ai didi

c++ - 异常处理期间的类型解析

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:36:43 25 4
gpt4 key购买 nike

当在 C++ 中抛出异常并且展开堆栈时,如何选择正确的处理程序(catch 子句)来处理异常?

void f1()
{
throw 1;
}

void f2()
{
try
{
f1();
}
catch(const char* e)
{
std::cout << "exc1";
}
}

...
try
{
f2();
}
catch(int& e)
{
std::cout << "exc2";
}
...

例如,这段代码毫不奇怪地打印出 "exc2" 因为 catch(int& e) 能够处理 1 int 类型对象。

我不明白的是,如何静态解决这个问题?还是动态解决?类型信息是否传播异常?

最佳答案

对于大多数事情,C++ 标准不指定实现,但限制了有效的实现。不会有一个了解具体细节的通用答案。

Itanium ABI 是一种流行的 ABI,它提供与语言无关的异常支持。在该实现中,展开 API 调用堆栈帧的个性函数,该函数接收异常上下文、异常结构和对指导捕获行为的异常处理表的引用。根据程序异常表中调用的返回地址查找个性函数;假定唯一可以引发异常的指令是调用指令。 (GCC 具有允许通过启用“非调用异常”从信号处理程序中抛出的扩展。)使用 Itanium ABI 的编译器提供了一个个性函数,该函数知道如何检查异常对象的运行时类型,并将该类型与元素进行比较异常表。

还有其他方法可以做到这一点。例如,在 32 位 Windows 上,异常处理通过在堆栈上将处理函数设置为链表项来工作。这些链表节点包含异常处理程序的地址,它们使用 EXCEPTION_RECORD弄清楚从那里去哪里。不幸的是,我自己对细节有点稀疏。

顺便说一下,Itanium ABI 并不是 C++ 独有的。例如,在 Apple 平台上,Objective-C 代码也使用 Itanium ABI 处理异常。这有一个有趣的特性,即任何一种语言的包罗万象的子句都会捕获另一种语言的异常。

关于c++ - 异常处理期间的类型解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44141449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com