C ++构造函数异常处理

时间:2014-04-22 19:51:30

标签: c++ exception exception-handling constructor

我是C ++中异常处理的新手,最近我遇到了一些问题。

在我的代码中,我想创建一个对象,只有其中一个。我正在与一个库连接,我必须为构造函数提供输入。以下是对构造函数的调用:

ObjectA my_object(param1, param2, param3);

我的问题是构造函数本身可以抛出异常。我过去曾做过有限的异常工作(我知道try-catch机制),但由于范围可变,我不知道该怎么做。例如:

try {
  ObjectA my_object(param1, param2, param3);
}
catch {
  // don't worry I need to do more than this here, just an example...
  cout << "OMFG!" << endl;
  exit(EXIT_FAILURE);
}
// if code got here, everything with my_object is OK
my_object.Method1(param1);  // ERROR: my_object is out of scope!

我可以快速了解一些帮助,以便检查正确构造的对象。感谢

3 个答案:

答案 0 :(得分:2)

好吧,就像这样:

try {
  ObjectA my_object(param1, param2, param3);
  my_object.Method1(param1);
  // other work
}
catch (/* the exception that constructor can throw */ ){
   // error handling stuff
}

如果try块变大,则将代码从其移动到另一个函数。

答案 1 :(得分:2)

如果操作次数很少,有时您会这样做:

try {
    ObjectA my_object(param1, param2, param3);
    my_object.Method1(param1);
}catch(...)
{exit(EXIT_FAILURE);}

通常,如果构造函数可以抛出异常,则存在另一种无异常的initailize方法:

ObjectA my_object; //may or may not be valid by itself 
try {
    my_object = ObjectA(param1, param2, param3); //initialize and copy-construct
    //alternatively:
    my_object.open(param1, param2, param3);
}catch(...)
{exit(EXIT_FAILURE);}
my_object.Method1(param1);

否则,最推荐的解决方案是:

boost::optional<ObjectA> my_object; //make it OPTIONAL
try {
    my_object = ObjectA(param1, param2, param3); //initialize and copy-construct
}catch(...)
{exit(EXIT_FAILURE);}
my_object.Method1(param1);

(如果你不喜欢提升,optional如果你知道新的工作方式是如何工作那么自己实现起来非常简单。

如果可选的东西太吓人了,它也可以通过动态内存轻松复制:

std::unique_ptr<ObjectA> my_object; //make it OPTIONAL
try {
    my_object.reset(new ObjectA(param1, param2, param3)); //initialize and copy-construct
}catch(...)
{exit(EXIT_FAILURE);}
my_object->Method1(param1);

答案 2 :(得分:1)

void doStuff()
{
  ObjectA my_object(param1, param2, param3);
  my_object.Method1(param1); 
}

try {
  doStuff();
}
catch {
  // don't worry I need to do more than this here, just an example...
  cout << "OMFG!" << endl;
  exit(EXIT_FAILURE);
}

或简单地将所有相关语句放在try块中。