以下のキャッチ()が呼び出されていません。Linux C++でシステムレベルの例外をキャッチするにはどうすればよいですか?
void test(void)
{
int i=1,j=0,k;
try
{
k = i/j;
}
catch(...)
{
...handle it...
}
}
例外のこの種をキャッチする方法はありますか?
以下のキャッチ()が呼び出されていません。Linux C++でシステムレベルの例外をキャッチするにはどうすればよいですか?
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によってフロートdiv要素は、その後、ほとんどの浮動小数点システムはIEEE標準に基づいています
ので、「FPE_ZERODIVIDE」
signal(SIGFPE, (fptr) FPE_ExceptionHandler);
void FPE_ExceptionHandler(int nSig,int nErrType,int */*pnReglist*/)
{
switch(nErrType)
{
case FPE_ZERODIVIDE: /* ??? */ break;
}
}
を生成します0で除算することができます。これは、数値の符号に基づいて正の無限大または負の無限大を適切に返します。 (0/0が未定義のNANを返すことを除いて - 例外的なケースではない - これは科学的および数学的なアプリケーションに役立つ傾向がある。 NANは、事実上、計算が不可能であるが、計算を続けることを可能にする。継続的な計算では新しい結果は得られませんが、引き続きNANが返されます。これにより、計算の中でエラーチェックを行わずに長い長い計算チェーンを実行することができます。エラーチェックは、作業の最後に実行する必要があります。これにより、コードははるかに簡単で高速になります。また、いくつかのアプリケーションの場合と同様に、時にはより有用なこともありますが、実際には問題の兆候ではありません。
いいえ - 例外はスローされません(信号があります - おそらくSIGFPE)。
これにより実行時エラーが発生する場合は(lakshmanaraj's nice discussion on IEEE mathsを参照してください。ただし、一部のコンパイラではNaNの代わりにエラーが発生します)浮動小数点例外シグナルをスローします。
信号は、C++例外とは異なるメカニズムであり、OSレベルで処理されます。含む* nixの信号メカニズムを、関係SO質問の数既にあります、Windows用の
は、あなたが他の誰かに依頼する必要があります。 Mac OS Xは、もちろん、UNIX系のシステムです。
Windowsは構造化例外処理と呼ばれる独自のメカニズムを持っています、それはSEHと略されて表示されます:http://msdn.microsoft.com/en-us/library /ms680657(VS.85).aspx –
-mcheck-zero-divisionオプションは、MIPSアーキテクチャに固有のオプションであることに注意してください。例えば。 x86では動作しません。 – janneb
はい、あなたは正しいです、我々はSIGFPEハンドラのために行く必要があります.. – lakshmanaraj