处理构造函数的异常

时间:2011-04-21 10:45:15

标签: c++ exception-handling

这是我的采访问题。

令人惊讶的是,我从来没有想过这个问题。

我们可以在构造函数c ++中进行异常处理吗?

在时态中并没有多想我说“是的我们可以在构造函数中执行它。我们说我们使用new运算符为指针成员分配一些内存并且它抛出一个错误的alloc异常,这样就有一个提出例外的可能性“

后来我认为构造函数永远不能返回一个值。那么构造函数中的异常如何被捕获。现在我问这个问题!

任何人都可以帮助我摆脱这种混乱吗?

4 个答案:

答案 0 :(得分:12)

请参阅此GOTW Constructor Failures问题,该问题会在一定程度上解决您的查询,并继续说这是浪费时间。

答案 1 :(得分:2)

  

构造函数没有返回类型,   所以不可能使用退货   码。信号的最佳方式   因此构造函数失败   抛出一个例外。如果你没有   使用例外的选项,   “最不好”的解决办法就是放弃   对象变成了“僵尸”状态   设置内部状态位,以便   对象行为有点像死了   即使它在技术上仍然是   活着。

您将在调用代码中捕获异常,而不是在构造函数中。

有关详细信息,请参阅How can I handle a constructor that fails?(实际上,我建议您阅读有关异常处理,真正具有启发性的整个页面。)

答案 2 :(得分:0)

异常处理和返回类型完全不同。当程序在构造函数中找到异常时,它几乎通过catch块[if used]或抛出到调用者(main())抛出异常。在这种情况下,我们在构造函数中捕获块并由它处理异常。处理完异常后,构造函数/函数中的剩余语句将开始执行。见下面的例子,

class A
{
  public:
   A(){
        printf("Hi Constructor of A\n");        
   try
   {
        throw 10;
   }
   catch(...)
   {
       printf("the String is unexpected one in constructor\n");
   }
   printf("Hi Constructor of A\n");
 }
   ~A(){
   printf("Hi destructor of A\n");
 }
};

int main()
{

try{
    A obj ;
   throw "Bad allocation";
}
catch(int i)
{
    printf("the Exception if Integer is = %d\n", i);
}
 catch(double i)
{
    printf("the Exception if double is = %f\n", i);
}
 catch(A *objE)
{
    printf("the Exception if Object \n");
}
 catch(...)
{
    printf("the Exception if character/string \n");
}
printf("Code ends\n");
return 0;
}

这产生输出:

 Start: Constructor of A
 the String is unexpected one in constructor
 End: Constructor of A
 Hi destructor of A
 the Exception if character/string 
 Code ends

答案 3 :(得分:-2)

C ++有类似于其他语言的try-catch子句。可以在线找到教程:http://www.cplusplus.com/doc/tutorial/exceptions/

编辑:示例变成了完全正常工作的代码

#include <iostream>
using namespace std;

class A
{
public:
  void f(){
    throw 10;
  }

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

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

  A a;
  return 0;
}

这会产生输出:

Exception caught