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++ : Catch a 除以零错误以及C++ 的(非)handline of 除以零

于 2012-05-05T10:33:19.327 回答