Sur*_*uri 0 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();
}
Run Code Online (Sandbox Code Playgroud)
//如果我用以下代码替换foo(),那么它运行良好
void foo()
{
try{
XYZ xyz(10);
}catch(...){}
}
Run Code Online (Sandbox Code Playgroud)
来自:http://gotw.ca/gotw/066.htm
不太明显但在标准中明确指出的是,如果catch块没有抛出(重新抛出原始异常,或抛出新的东西),并且控制到达构造函数或析构函数的catch块的末尾,那么原始异常会自动重新抛出.
从标准15.3/16
如果控制到达构造函数或析构函数的function-try-block的处理程序的末尾,则重新抛出正在处理的异常.否则,当控制到达function-try-block(6.6.3)的处理程序的末尾时,函数返回.流出函数try-block的末尾相当于没有值的返回; 这导致值返回函数(6.6.3)中的未定义行为.