2012-05-05 17 views
3

私はこのコンストラクタの例外を処理するテストコードを持っています。 関数f()はゼロによる例外除算を作成しますが、この例外は捕捉されません。 代わりにカスタム整数をスローすると例外が捕捉されます。私はカスタム スロー10をキャッチすることができますなぜ なぜコンストラクタで例外をキャッチできないのですか?

#include <iostream> 
using namespace std; 

class A 
{ 
public: 
    void f(){ 
    int x; 
    x=1/0; 
    //throw 10; 
    } 

A(){ 
    try{ 
    f(); 
    } 
    catch(int e){ 
     cout << "Exception caught\n"; 
     } 
    } 
}; 

int main (int argc, const char * argv[]) 
{ 

    A a; 
    return 0; 
} 

。 ではなく、 x = 1/0であり、

答えて

7

整数をゼロで割った値は、標準のC++例外ではありません。したがって、暗黙的にスローされる例外に頼ることはできません。特定のコンパイラでは、除算をゼロでマップすることができます(これについてはコンパイラのドキュメントをチェックする必要があります)。ただし、これは移植可能な動作ではなく、すべてのコンパイラで動作するわけではありません。

あなたができることは、エラー状態(除数はゼロに等しい)を確認し、明示的に例外をスローすることです。

class A 
{ 
    public: 
     void f() 
     { 
      int x; 
      //For illustration only 
      int a = 0; 
      if(a == 0) 
        throw std::runtime_error("Divide by zero Exception"); 
      x=1/a; 
     } 

     A() 
     { 
       try 
       { 
        f(); 
       } 
       catch(const std::runtime_error& e) 
       { 
        cout << "Exception caught\n"; 
        cout << e.what(); 
       } 
     } 
}; 
+0

ゼロで整数除算を行うと、クラッシュ、鼻の悪魔、プログラマが妊娠してしまうなど、何らかの事態が起こる可能性があることに注意してください。 –

+0

よろしくお願いいたします...ありがとうございます – demosthenes

関連する問題