簡體   English   中英

以下代碼完美地結合在一起,但顯示運行時錯誤。 為什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM