C++ 异常处理构造函数

C++ 异常处理构造函数,c++,exception-handling,C++,Exception Handling,这是我的面试问题 令人惊讶的是,我从来没有想过这样的问题 在构造函数C++ + 中是否可以有异常处理? 我紧张地说,“是的,我们可能可以在构造函数中实现它。假设我们正在使用new运算符为指针成员分配一些内存,它会抛出一个错误的alloc异常,这样就有可能引发异常” 后来我认为构造函数永远不会返回值。那么,如何捕获构造函数中的异常呢?现在我在问自己这个问题 有谁能帮我摆脱这种困惑吗?C++有类似于其他语言的try-catch子句。可以在网上找到教程: 编辑:将示例转换为完全工作的代码 #inclu

这是我的面试问题

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

在构造函数C++ +

中是否可以有异常处理? 我紧张地说,“是的,我们可能可以在构造函数中实现它。假设我们正在使用new运算符为指针成员分配一些内存,它会抛出一个错误的alloc异常,这样就有可能引发异常”

后来我认为构造函数永远不会返回值。那么,如何捕获构造函数中的异常呢?现在我在问自己这个问题


有谁能帮我摆脱这种困惑吗?

C++有类似于其他语言的try-catch子句。可以在网上找到教程:

编辑:将示例转换为完全工作的代码

#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;
}
构造函数没有返回类型, 所以不可能使用return 代码。发出信号的最佳方式 因此,构造函数失败是不可避免的 抛出异常。如果你没有 使用异常的选项 “最不坏”的解决办法是把 对象变为“僵尸”状态 设置内部状态位,以便 对象的行为有点像死了一样 尽管从技术上讲它仍然是 活着


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


有关更多详细信息,请参阅(实际上,我建议阅读整页关于异常处理的内容,这确实很有启发性)。

请参阅这个问题,它在一定程度上解决了您的查询,并继续说这是浪费时间。

异常处理和返回类型完全不同。当程序在构造函数中找到异常时,它会将异常抛出到几乎是副捕获块[如果使用]或抛出到调用方(main())。在本例中,我们在构造函数中有catch块,并由它处理异常。异常处理后,构造函数/函数中的剩余语句将开始执行。参见下面的示例

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

您将在调用代码中捕获异常,而不是在构造函数中。异常的返回方式与返回值不同,它们会跳到堆栈的第一个适当的捕获块,因此,虽然无法从构造函数返回值,但可以从构造函数中抛出异常。@Helper方法:如果在构造函数中已分配内存,则肯定希望在构造函数中捕获异常,以便可以取消分配内存(然后可能重新抛出)。但是它更聪明,对象只有动态分配最多一个对象,这样就不需要做手动的清理了。@ LAS。我知道有很多文档。但是我特别问一个构造中的异常处理。这不解决我的问题。C++没有<代码>最后< /Cord>块,C++中的异常处理在很多方面与java等语言不同。对于清理,C++使用@帮助器方法——当然,你对“代码>最后是”,但是我理解,“僵尸问了构造函数中的异常处理,所以我的例子仍然有效,或者应该纠正这个问题。我用更多的代码更新了我的答案。@zombie-我扩展了这个例子来展示构造函数内部的exeption处理。如果这不是你所问的,那么也许可以作为一个在构造函数出错后清理的实际例子。我读了这篇文章。但我期待人们在这种情况下使用一些实用的方法。+1,尽管有人不得不说这个问题也有点诡计。通常,当构造函数以某种方式失败时,您只是在构造函数内部抛出,但完全有可能在构造函数内部尝试/捕获以处理其他失败,并首先避免所述构造函数的失败(或重新抛出)。视情况而定,这可能更可取。例如,如果您在构造函数中构造了两个对象,而第二个对象抛出bad_alloc,您会怎么做?捕获调用代码中的异常将泄漏第一个对象。构造函数内部的处理避免了这种情况。@zombie:什么场景?从构造函数引发的异常?构造函数失败?一个构造函数捕获异常?实际问题不是如何去做它,而是你是否应该考虑它。它带来的问题比实际解决方案多。即使在编译器没有适当异常支持的平台上(在Symbian中,它不会删除部分构造对象的子对象),构造函数也不会禁止异常,而是在构造函数外部通过两阶段初始化处理整个问题(使用一个
nothrow
构造函数和第二个可以抛出的初始化函数,您可以管理失败)。然后,在其中工作是一件痛苦的事情。@Damon:如果您使用智能指针(这是一个对象应该只管理单个资源的主要原因)。
struct test{std::auto_ptr a,b;type will_throw;test():a(new int),b(new int),will_throw(){};
——将调用a和b的析构函数,它们将管理内存。+1我本来打算把函数try块作为一个选项来写,以及它的许多缺陷,但我不会接近Sutter的描述:)这是一篇非常有趣的文章,def+1
 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