4

次の catch() は呼び出されません。

void test(void)
{
    int i=1,j=0,k;
    try
    {
        k = i/j;
    }
    catch(...)
    {
        ...handle it...
    }
}

この種の例外をキャッチする方法はありますか?

4

3 に答える 3

9

これを処理するコンパイラ オプション -mcheck-zero-division があるhttp://linux.die.net/man/1/gccを確認してください 。

または、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 が返されます。これにより、計算内でエラー チェックを行わずに、長い長い一連の計算を実行できます。エラーチェックは、作業の最後にのみ実行する必要があります。これにより、コードがはるかに単純になり、高速になります。また、一部のアプリケーションに関しては、より便利な場合もあります。

于 2009-03-06T09:40:47.190 に答える
3

いいえ - 例外はスローされません (シグナルを受け取ります - おそらく SIGFPE)。コード内のゼロによる除算の可能性を確認してから、自分で例外をスローする必要があります。

于 2009-03-06T09:50:10.567 に答える
3

これにより実行時エラーが発生した場合 ( IEEE 数学に関する lakshmanaraj の素晴らしい議論を参照してください。ただし、一部のコンパイラでは NaN の代わりにエラーを強制できます)、浮動小数点例外シグナルがスローされます。

シグナルは、c++ 例外とは異なるメカニズムであり、OS レベルで処理されます。*nix シグナルメカニズムに関しては、次のような SO に関する質問がすでに多数あります。

Windowsの場合は、他の人に尋ねる必要があります。Mac OS X は、もちろん、UNIX から派生したシステムです。

于 2009-03-06T15:50:47.660 に答える