不同平台上的系统异常处理

System exception handling on different platforms

本文关键字:系统 异常处理 平台      更新时间:2023-10-16

基本上,如何在mac/linux上捕获异常?也就是说,例外情况不是语言固有的,比如segfals&整数除法。在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 %dn", x);
    }
    return 0;
}

在Unix中,您可以通过信号处理程序捕获处理器故障,使用sigaction函数为要处理的signal安装合适的处理程序。

(我想你指的是__try ... __except而不是__try ... __catch