2011-01-29 6 views
2

ゼロ除算エラーが発生した場合、どのような例外がスローされますか?私は "キャッチオール" catch(...)を使用しようとしましたが、Visual Studioはまだ未処理の例外があると訴えています。ゼロで除算すると、どのような例外がスローされますか?

int a = 0; 
try 
{ 
    a /= a; 
} 
catch (/* what should I catch?*/) 
{ 
    cout << "divide by zero error" << endl; 
} 

注:私は前に手(ゼロで除算しようとする前にゼロである場合、例えばチェック)この種の問題を防ぐ方法を求めていませんよ。

+4

あなたはこれを見たことがありますか:http://www.jdl.co.uk/briefings/divByZeroInCpp.html?通常、例外はスローされません。 –

+0

ありがとう、それはそれを完全に説明します。 – helloworld922

答えて

9

これはC++の質問ではありません。標準のC++ではこれができないためです。

Windowsでは、これによりStructured Exception Handling例外が生成されます。

は、MSDNからthis exampleを参照してください:

__try 
{ 
    *pResult = dividend/divisor; 
} 
__except(GetExceptionCode() == EXCEPTION_INT_DIVIDE_BY_ZERO ? 
     EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) 
{ 
    return FALSE; 
} 

これはしかし、非ポータブルおよびWindowsに固有のものです。最後に、GCCはWindowsでさえそれをサポートしていないことを知っていました。

もっと広い質問をしている場合は、0で除算するとCPUが割り込みを発生させます。 Windowsカーネルはこれを処理し、それをプロセスに渡し、それを処理する機会を与えます。あなたがそれを処理しなければ、あなたのプロセスは死ぬ。 UnixタイプのOSでは同じものが保持されますが、おそらくシグナルが発生します。どちらが確実かわかりません。

ポータブルなC++コードを書いたければ、ハードウェアに頼ってフォールトを生成するのではなく、ソフトウェアでゼロで割ることをチェックし、OSカーネルが移植性の低い機構。

+5

また、 '/ EHa'でコンパイルすると、' catch(...) 'で捕捉されます。また、OS構造化例外とC++言語例外との間のギャップを埋めるVisual C++固有の 'set_se_translator'関数もあります。 –

+3

UNIXの世界では、0で割ったときに 'SIGFPE'シグナルが発生します。 http://en.wikipedia.org/wiki/SIGFPEを参照してください。 –

関連する問題