gpt4 book ai didi

c++ - 我如何在运行时确定是否有特定 C++ 异常类的 catch block ?

转载 作者:太空狗 更新时间:2023-10-29 20:06:38 24 4
gpt4 key购买 nike

在 Linux 上,我希望能够确定特定异常类(或该类的父类(super class))的捕获 block 当前是否在范围内(忽略捕获所有 block )。

特别是,我希望能够实现 isThereACatchBlock 函数,使其表现如下:

bool isThereACatchBlock( std::type_info const & ti ) {
...;
}

class MyException {
};

class MyDerivedException : public MyException {
};

class MyOtherException {
};

void f() {
try {
isThereACatchBlock( typeid( MyException ) ); // Should return true
isThereACatchBlock( typeid( MyDerivedException ) ); // Should return true
isThereACatchBlock( typeid( MyOtherException ) ); // Should return false
} catch( MyException const & e ) {
} catch( ... ) {
}
}

我知道系统有这个信息,以便它可以正确地执行异常处理——我相信它存储在 .eh_frame 和/或 .gcc_except_table 部分中,如 this post 中所述。 .但是,我不确定程序是否有任何简单的(-ish)方法来解释该信息。谁能帮忙?

最佳答案

阅读您的一条评论后,我发现您想这样做的一个原因是避免为已处理的异常生成回溯,但未处理的异常则需要回溯。

如果这就是您想要这样做的原因,您可以使用 std::set_terminate() 来设置一个终止处理程序,它会在发生未处理的异常时调用。使用我自己的回溯处理程序进行测试,回溯显示跟踪一直到导致失败的 throw(),因为 throw 基本上直接调用终止处理程序,在它意识到不会捕获异常之后。

请注意,这只会捕获最近一次抛出的堆栈,直到它终止。如果您捕获然后重新抛出异常,则初始抛出和捕获之间的堆栈将展开并且不再可用。

int foo() {
throw std::runtime_error("My error");
}
std::terminate_handler old_term_func;
void term_func() {
// Insert backtrace generation/output here
old_term_func();
}

void test() {
try {
foo();
} catch (const std::runtime_error& e) {
std::cout <<"Exception caught, no backtrace generated" << std::endl;
}
foo(); // Exception not caught, will call term_func
}
int main() {
old_term_func = std::set_terminate( term_func ) ;
test();
}

关于c++ - 我如何在运行时确定是否有特定 C++ 异常类的 catch block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6996861/

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