【问题标题】:C++ Constructor Exception HandlingC++ 构造函数异常处理
【发布时间】:2014-04-22 19:51:29
【问题描述】:

我是 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!

如果我可以快速检查正在正确构造的对象,我们将不胜感激。谢谢

【问题讨论】:

  • 将与对象相关的所有内容都放在try块中。

标签: c++ exception exception-handling constructor


【解决方案1】:

嗯,像这样:

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

如果try 块太大,请将代码从它移到另一个函数。

【讨论】:

    【解决方案2】:

    如果动作的数量很少,有时你会这样做:

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

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

    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);
    

    (如果您不喜欢 boost,optional 如果您知道放置 new 的工作原理,那么您自己实现起来非常简单)

    如果可选的东西太吓人,它也很容易通过动态内存复制:

    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);
    

    【讨论】:

      【解决方案3】:
      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 块中。

      【讨论】:

        猜你喜欢
        • 2016-01-08
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 1970-01-01
        相关资源
        最近更新 更多