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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2025/4/16 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】 外传篇 2_函数的异常规格说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

函數的異常規格說明

問題: 如何判斷一個函數是否會拋出異常,以及拋出哪些異常?

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

    • 提示函數調用者必須做好異常處理的準備
    • 提示函數維護者不要拋出其它異常
    • 異常規格說明是函數接口的一部分

問題: 如果拋出的異常不在聲明列表中,會發生什么?

編程實驗: 異常規格之外的異常

#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++ :編譯后可執行程序異常停止 vc++2010 :func(); 拋出的異常被被捕獲
  • 函數拋出的異常不在規格說明中,全局 unexpected() 被調用
  • 默認的 unexpected() 函數會調用全局的 terminated() 函數
  • 可以自定義函數替換默認的 unexpected() 函數實現
  • 注意: 不是所有的 C++ 編譯器都支持這個標準行為(例:vc++2010)

  • unexpected() 函數的替換

    • 自定義一個無參數無返回值的函數

      • 能夠再次拋出異常

        • 當異常符合觸發函數的異常規格說明時,恢復程序執行
        • 否則,調用全局 terminate() 函數結束程序
    • 調用 set_unexpected() 設置自定義的異常函數

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

編程實驗: 自定義 unexpected() 函數

#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)

總結:
對于異常規格說明,不同的編譯器有不同的行為。在實際項目中,可編寫測試程序查看使用的編譯器有沒有遵循 C++ 規范。

小結

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

    • 異常能夠匹配,恢復程序的執行
    • 否則,調用 terminate() 程序結束

以上內容參考狄泰軟件學院系列課程,請大家保護原創!

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。