下面的代码完美地编译,但显示运行时错误。为什么?

时间:2010-04-30 09:05:00

标签: c++ exception-handling

// sample.h

int calci(int &value)
{
   if(value < 20)
    throw value;
   else
     return value;
}

class XYZ
{
   int m_x;
   public: XYZ(int &x)try:m_x(x-calci(x))
          {
          }catch (int &a)
          {}

};
class ABC
{
   int m_a;
   public: ABC():m_a(0)
   {
   }
    void foo()
    {
        XYZ xyz(10);


    }
};




int main()
{
   ABC abc;
   abc.foo();
}

//如果我用下面的代码替换foo()那么它运作良好

void foo()
{
  try{
    XYZ xyz(10);
  }catch(...){}
}

1 个答案:

答案 0 :(得分:5)

来自:http://gotw.ca/gotw/066.htm

  

什么不那么明显,但很清楚   在标准中说明,如果是   catch block不抛(或者   重新抛出原始异常,或   抛出新的东西)和控制   到达catch块的末尾   一个构造函数或析构函数,然后是   原始异常是自动的   重新抛出。

从标准15.3 / 16

  

正在处理的例外是   如果控制到达结束时重新生长   function-try-block的一个处理程序   构造函数或析构函数。   否则,函数返回时   控制到达处理程序的末尾   for function-try-block(6.6.3)。   流出一个结束   function-try-block相当于a   没有价值的回报;这导致了   一个未定义的行为   价值回报函数(6.6.3)。