日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

【C++】 外传篇 2_函数的异常规格说明

發(fā)布時(shí)間:2025/4/16 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】 外传篇 2_函数的异常规格说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

函數(shù)的異常規(guī)格說(shuō)明

問(wèn)題: 如何判斷一個(gè)函數(shù)是否會(huì)拋出異常,以及拋出哪些異常?

  • C++ 提供語(yǔ)法用于聲明函數(shù)所拋出的異常
  • 異常聲明作為函數(shù)聲明的修飾符,寫(xiě)在參數(shù)列表后面
/** 可能拋出任何異常 */ void func1();/** 只能拋出的異常類型: char 和 int */ void func2() throw(char, int);/** 不拋出任何異常 */ void func3() throw();
  • 異常規(guī)格說(shuō)明的意義

    • 提示函數(shù)調(diào)用者必須做好異常處理的準(zhǔn)備
    • 提示函數(shù)維護(hù)者不要拋出其它異常
    • 異常規(guī)格說(shuō)明是函數(shù)接口的一部分

問(wèn)題: 如果拋出的異常不在聲明列表中,會(huì)發(fā)生什么?

編程實(shí)驗(yàn): 異常規(guī)格之外的異常

#include <iostream>using namespace std;void func() throw(int) {cout << "func()" << endl;throw 'c'; }int main() {try{func();}catch(int){cout << "catch(int)" << endl;}catch(char){cout << "catch(char)" << endl;}return 0; } 輸出:[g++] func() terminate called after throwing an instance of 'char' 已放棄輸出:[vc2010] func() catch(char)注意: g++ :編譯后可執(zhí)行程序異常停止 vc++2010 :func(); 拋出的異常被被捕獲
  • 函數(shù)拋出的異常不在規(guī)格說(shuō)明中,全局 unexpected() 被調(diào)用
  • 默認(rèn)的 unexpected() 函數(shù)會(huì)調(diào)用全局的 terminated() 函數(shù)
  • 可以自定義函數(shù)替換默認(rèn)的 unexpected() 函數(shù)實(shí)現(xiàn)
  • 注意: 不是所有的 C++ 編譯器都支持這個(gè)標(biāo)準(zhǔn)行為(例:vc++2010)

  • unexpected() 函數(shù)的替換

    • 自定義一個(gè)無(wú)參數(shù)無(wú)返回值的函數(shù)

      • 能夠再次拋出異常

        • 當(dāng)異常符合觸發(fā)函數(shù)的異常規(guī)格說(shuō)明時(shí),恢復(fù)程序執(zhí)行
        • 否則,調(diào)用全局 terminate() 函數(shù)結(jié)束程序
    • 調(diào)用 set_unexpected() 設(shè)置自定義的異常函數(shù)

      • 參數(shù)類型為 void(*)()
      • 返回值為默認(rèn)的 unexpected() 函數(shù)入口地址

編程實(shí)驗(yàn): 自定義 unexpected() 函數(shù)

#include <iostream>using namespace std;void my_unexpected() {cout << "void my_unexpected()" << endl;// exit(1);throw 1; }void func() throw(int) {cout << "func()" << endl;throw 'c'; }int main() {set_unexpected(my_unexpected);try{func();}catch(int){cout << "catch(int)" << endl;}catch(char){cout << "catch(char)" << endl;}return 0; } 輸出:[g++] func() void my_unexpected() catch(int)輸出:[vc++2010] func() catch(char)

總結(jié):
對(duì)于異常規(guī)格說(shuō)明,不同的編譯器有不同的行為。在實(shí)際項(xiàng)目中,可編寫(xiě)測(cè)試程序查看使用的編譯器有沒(méi)有遵循 C++ 規(guī)范。

小結(jié)

  • C++ 中的函數(shù)可以聲明異常規(guī)格說(shuō)明
  • 異常規(guī)格說(shuō)明可以看作接口的一部分
  • 函數(shù)拋出的異常不在規(guī)格說(shuō)明中, unexpected() 被調(diào)用
  • unexpected() 中能夠再次拋出異常

    • 異常能夠匹配,恢復(fù)程序的執(zhí)行
    • 否則,調(diào)用 terminate() 程序結(jié)束

以上內(nèi)容參考狄泰軟件學(xué)院系列課程,請(qǐng)大家保護(hù)原創(chuàng)!

總結(jié)

以上是生活随笔為你收集整理的【C++】 外传篇 2_函数的异常规格说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。