亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在函數簽名中拋出關鍵字

在函數簽名中拋出關鍵字

C++
倚天杖 2019-11-08 14:19:03
throw在函數簽名中使用C ++ 關鍵字被認為是不好的做法的技術原因是什么?bool some_func() throw(myExc){  ...  if (problem_occurred)   {    throw myExc("problem occurred");  }  ...}
查看完整描述

3 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

Jalf已經鏈接了它,但是GOTW很好地說明了為什么異常規范沒有人們希望的有用:


int Gunc() throw();    // will throw nothing (?)

int Hunc() throw(A,B); // can only throw A or B (?)

評論正確嗎?不完全的。Gunc()可能確實會丟東西,并且Hunc()可能會丟掉A或B以外的東西!編譯器只是保證在它們發生錯誤時擊敗它們……哦,并且在大多數情況下也使您的程序失去意義。


這就是它的最終結果,您可能最終會調用,terminate()并且您的程序死于快速但痛苦的死亡。


GOTW的結論是:


因此,這似乎是我們作為一個社區迄今為止所獲得的最佳建議:


道德準則1:永遠不要編寫異常規范。

道德2:可能是空的,但如果我是你,我什至會避免。


查看完整回答
反對 回復 2019-11-08
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

要為該問題的所有其他答案增加更多的價值,您應該在該問題上花費幾分鐘:以下代碼的輸出是什么?


#include <iostream>

void throw_exception() throw(const char *)

{

    throw 10;

}

void my_unexpected(){

    std::cout << "well - this was unexpected" << std::endl;

}

int main(int argc, char **argv){

    std::set_unexpected(my_unexpected);

    try{

        throw_exception();

    }catch(int x){

        std::cout << "catch int: " << x << std::endl;

    }catch(...){

        std::cout << "catch ..." << std::endl;

    }

}

答:如前所述這里,程序調用std::terminate(),因此沒有任何異常處理程序將被調用。


詳細信息:my_unexpected()調用了第一個 函數,但是由于它沒有為throw_exception()函數原型重新拋出匹配的異常類型,因此最后std::terminate()調用了。因此完整的輸出如下所示:


user @ user:?/ tmp $ g ++ -oexcept.testexcept.test.cpp

user @ user:?/ tmp $。/ except.test

很好-這是

在拋出'int'

中止實例后意外終止傾銷)


查看完整回答
反對 回復 2019-11-08
  • 3 回答
  • 0 關注
  • 448 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號