C++でdivide by zeroを例外としてcatchするにはどうしたらいいだろうか

LinuxでC++を使うとき、gccのg++を使うことが多いだろう。でもいまいち使ってない。なぜか。例外がcatchできないからだろうと思った。というわけで。

C++でdivide by zeroやNULL pointer dereference等はtry〜catchで挟んでも例外としてはcatchできず、普通にシグナルハンドラに落ちる。どうしたらいいのか。

シグナルハンドラを登録してそっから投げりゃいいんじゃねえの?? と思って、そう書いてみた。

<br /> #include <iostream><br /> #include <exception><br /> extern &#8220;C&#8221;{<br /> #include <signal.h><br /> #include <stdlib.h><br /> };</p> <p>using namespace std;</p> <p>class sigexception{<br /> int val;<br /> public:<br /> sigexception(int a){<br /> val=a;<br /> }<br /> int getvalue(){ return val; }<br /> char *getstring(){ return strsignal(val); }<br /> };</p> <p>void sighandle(int a) throw(sigexception)<br /> {<br /> throw sigexception(a);<br /> }</p> <p>int main(int argc, char **argv)<br /> {<br /> signal(SIGINT, sighandle);<br /> signal(SIGFPE, sighandle);<br /> signal(SIGSEGV, sighandle);<br /> signal(SIGBUS, sighandle);<br /> &#8230;.<br /> }<br />

で、try{ sleep(10000); }catch(sigexception e){}みたいにして、killコマンドでシグナルを投げてみると、普通にcatchできた!!

と思ったけど、1/0とか計算して本物の例外を出してみるとダメでした。シグナルハンドラ(上のコードで言うsighandle)は起動するんだけど、terminate called after throwing an instance of ‘sigexception’ とか言われ、例外はcatchできずに落ちる。どうしてそうなんだろう…。

コンパイルするときに「-fexceptions」をつけてもダメ。Fedora Core 3のgcc-c++-3.4.3-22.fc3とgcc4-c++-4.0.0-0.41.fc3で試して、どちらも挙動は同じでした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です