构造函数抛出异常的对象的异常处理是否可以接近基于堆栈的代码创建?

k2_*_*191 0 c++ exception-handling

我正在尝试使我的C++代码异常安全,并且遇到一个问题,既不询问朋友也不搜索网络会有所帮助.

根据我的理解,当使用构造函数创建一个可能抛出异常的对象时,创建代码需要用try块括起来并且异常处理完成catch(){}.

如果创建是基于堆的(例如,new使用默认分配器编辑),我可以将异常处理代码放在创建附近,如下所示:

void f() {
  // work unrelated to Hoge object here

  try {
    Hoge *pHoge = new Hoge(); // could throw an exception
  } catch(HogeException& ex) {
    // handle exception
  }

  // rest of work here
}
Run Code Online (Sandbox Code Playgroud)

但是,如果创建是基于堆栈的,由于try块的范围,我无法找到方法来执行此操作并使用下面的代码:

void g() {
  // work unrelated to Hoge object here

  try {
    Hoge hoge; // could throw an exception

    // rest of work here
  } catch(HogeException& ex) {
    // handle exception
  }
}
Run Code Online (Sandbox Code Playgroud)

如果// rest of work上面的代码很大,则对象创建和异常处理之间的位置距离可能很长,代码可读性降低......

我更喜欢异常处理代码是在对象创建附近(也许这是try- catch结构的概念之一).有什么解决方案吗?

Joh*_*ing 5

委托// rest of work给一个辅助函数,并传递Hoge&给该函数:

void RestOfWork(Hoge& hoge)
{
  // rest of work here
}

void g() {
  // work unrelated to Hoge object here

  try {
    Hoge hoge;
    RestOfWork(hoge);
    // rest of work here
  } catch(HogeException& ex) {
    // handle exception
  }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,Hoge hoge();没有做你认为它做的事情.您可能认为您声明了一个名为hogetype 的对象Hoge,并通过调用默认构造函数对其进行初始化.你实际在做的是声明一个名为的函数hoge,该函数不带参数并返回一个Hogeby值.我在上面的代码中解决了这个问题.

编辑确实,正如@LightnessRacesInOrbit所建议的那样,Hoge对象的构造也可以在延迟函数中进行,例如:

  void RestOfWork()
  {
       Hoge hoge;
      // rest of work here
  }

  void g() {
    // work unrelated to Hoge object here

    try {
      RestOfWork();
    } catch(HogeException& ex) {
      // handle exception
    }
  }
Run Code Online (Sandbox Code Playgroud)