3

コンストラクターで例外を処理するためのこのテストコードがあります。関数f()は、ゼロによる例外除算を作成しますが、この例外はキャッチされません。代わりに、カスタム整数をスローすると、例外がキャッチされます。

#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;
}

カスタムスロー10をキャッチできる理由。x=1/0ではありません。

4

2 に答える 2

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(); 
              }
         }
 }; 
于 2012-05-05T10:32:00.063 に答える
4

ゼロによる除算はC++の例外ではありません。

そこでの答えを見てください:C ++:ゼロ除算エラーC ++のゼロ除算の(非)ハンドラインをキャッチします

于 2012-05-05T10:33:19.327 に答える