基本上,如何在 mac/linux 上捕获异常?也就是说,不是语言固有的异常,例如段错误和整数除法。在 MSVC 上编译, __try __except 是完美的,因为堆栈处理允许捕获异常并在堆栈的下方继续执行。
现在,我想将我的程序扩展到其他平台(主要是提到的平台),但我不知道这些平台上的异常处理是如何工作的。据我了解,它是通过posix信号处理的?因此,不允许处理异常并继续降低堆栈?
编辑:这是否有效(伪代码)?正如我所看到的,我正确地保留了 C++ 块,因此不要沉迷于 UB。
jmp_buf buffer;
template< typename func >
protected_code(func f) {
if(!setjmp(buffer) {
f();
}
else
{
throw std::exception("exception happened in f()"):
}
}
void sig_handler() {
longjmp(buffer);
}
int main() {
sigaction(sig_handler);
try {
protected_code( [&]
{
1/0;
}
);
}
catch(const std::exception & e) {
...
}
}
编辑 2:哇,出于某种原因,我从没想过只从信号处理程序中抛出 C++ 异常,然后不需要使用 longjmp/setjmp。它当然依赖于调用信号处理程序的线程与出错的堆栈和线程相同的事实。这是在某处定义/保证的吗?代码示例:
void sig_handler(int arg) {
throw 4;
}
int main() {
signal(SIGFPE, sig_handler);
try {
int zero = 1;
zero--;
int ret = 1/zero;
} catch(int x) {
printf("catched %d\n", x);
}
return 0;
}