【C++】 外传篇 2_函数的异常规格说明
生活随笔
收集整理的這篇文章主要介紹了
【C++】 外传篇 2_函数的异常规格说明
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
函數(shù)的異常規(guī)格說(shuō)明
問(wèn)題: 如何判斷一個(gè)函數(shù)是否會(huì)拋出異常,以及拋出哪些異常?
- C++ 提供語(yǔ)法用于聲明函數(shù)所拋出的異常
- 異常聲明作為函數(shù)聲明的修飾符,寫(xiě)在參數(shù)列表后面
-
異常規(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ù)類(lèi)型為 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)題。
- 上一篇: BZOJ 3930 [CQOI2015]
- 下一篇: 冷启动问题:如何构建你的机器学习组合?