0

基本的に、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;
}
4

1 に答える 1

1

Unix では、関数を使用して、処理したい にsigaction適したハンドラーをインストールし、シグナル ハンドラーでプロセッサの障害をキャッチします。signal

__try ... __except(ではなく、という意味だと思います__try ... __catch

于 2013-08-13T23:24:28.673 に答える