[英]following code comipling perfectly but showing runtime error . why?
//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(...){}
}
來自: http : //gotw.ca/gotw/066.htm
在標准中不太明顯但明確指出的是,如果catch塊沒有拋出(要么拋出原始異常,要么拋出新的東西),並且控制到達構造函數或析構函數的catch塊的末尾,則原始異常會自動重新拋出。
從標准15.3 / 16起
如果控制到達構造函數或析構函數的function-try-block的處理程序的末尾,則正在處理的異常將被拋出。 否則,當控制權到達function-try-block(6.6.3)的處理程序的末尾時,函數將返回。 從function-try-block的末尾流出就等於沒有值的返回。 這會導致值返回函數(6.6.3)出現不確定的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.