【问题标题】:why can't catch exception in a constructor?为什么不能在构造函数中捕获异常?
【发布时间】:2012-05-05 10:28:28
【问题描述】:

我有这个测试代码来处理构造函数中的异常。 函数 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;

【问题讨论】:

    标签: c++ exception constructor


    【解决方案1】:

    整数除以零不是标准 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(); 
                  }
             }
     }; 
    

    【讨论】:

    • 请注意,整数除以零,任何事情都可能发生,包括崩溃、鼻恶魔和程序员怀孕。
    【解决方案2】:

    除以零不是 C++ 异常。

    看看那里的答案:C++ : Catch a divide by zero errorC++'s (non-)handline of division by zero

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多