Linux C ++でシステムレベルの例外をキャッチするにはどうすればよいですか?
質問
次のcatch()は呼び出されません:
void test(void)
{
int i=1,j=0,k;
try
{
k = i/j;
}
catch(...)
{
...handle it...
}
}
この種の例外をキャッチする方法はありますか?
解決
確認してください http://linux.die.net/man/1/gcc これを処理するコンパイラオプション-mcheck-zero-divisionがあります。
別の方法として、SIGFPEハンドラーをインストールすることもできますが、 0のfloat divは、「FPE_ZERODIVIDE」を生成します
signal(SIGFPE, (fptr) FPE_ExceptionHandler);
void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
{
switch(nErrType)
{
case FPE_ZERODIVIDE: /* ??? */ break;
}
}
以降
ほとんどの浮動小数点システムは、0で除算できるIEEE標準に基づいています。これにより、数値の符号に基づいて正の無限大または負の無限大が適宜返されます。 (0/0を除き、未定義のNANが返されます。これは例外的なケースではありません。)これは、科学的および数学的なアプリケーションに役立ちます。 NANは、計算が可能ではないが、計算を続行できる場合に効果的に信号を送ります。継続的な計算では新しい結果は生成されませんが、NANが返され続けます。これにより、計算内のエラーチェックなしで計算の長い長いチェーンを実行できます。エラーチェックは、作業の最後にのみ実行する必要があります。これにより、コードがはるかに簡単になり、高速になります。また、一部のアプリケーションでは、未熟さは「有用」であるため、時々より有用になる可能性があります。結果、実際には問題の兆候ではありません。
他のヒント
いいえ-例外はスローされません(シグナルを受け取ります-おそらくSIGFPE)。コードでゼロ除算の可能性を確認し、自分で例外をスローする必要があります。
これによりランタイムエラーが発生する場合( lakshmanarajのIEEE数学に関する優れた議論。一部のコンパイラではNaNの代わりにエラーを強制することができますが)、浮動小数点例外 signal がスローされます。
シグナルはc ++例外とは異なるメカニズムであり、OSレベルで処理されます。 * nixシグナルメカニズムに関して、次のようなSOの質問が既にいくつかあります。
Windowsの場合、他の人に尋ねる必要があります。 Mac OS Xは、もちろんUNIX由来のシステムです。