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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

C++解析-外传篇(1):异常处理深度解析

發布時間:2023/12/13 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++解析-外传篇(1):异常处理深度解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0.目錄

1.異常的最終處理

2.結束函數terminate()

3.小結

1.異常的最終處理

問題:
如果在main函數中拋出異常會發生什么?
如果異常不處理,最后會傳到哪里

下面的代碼的輸出什么?

示例——異常的最終處理?:

#include <iostream>using namespace std;class Test { public:Test() {cout << "Test()"; cout << endl;}~Test() {cout << "~Test()"; cout << endl;} };int main() {static Test t;throw 1;return 0; }

運行結果為:

[root@bogon Desktop]# g++ test.cpp [root@bogon Desktop]# ./a.out Test() terminate called after throwing an instance of 'int' Aborted (core dumped)

(不同編譯器的運行結果不同。)

2.結束函數terminate()

  • 如果異常無法被處理terminate() 結束函數會被自動調用
  • 默認情況下,terminate() 調用庫函數 abort() 終止程序
  • abort() 函數使得程序執行異常而立即退出
  • C++支持替換默認的 terminate() 函數實現

terminate() 函數的替換:

  • 自定義一個無返回值無參數的函數
  • 不能拋出任何異常
  • 必須以某種方式結束當前程序
  • 調用 set_terminate() 設置自定義的結束函數
  • 參數類型為 void (*) ()
  • 返回值為默認的 terminate() 函數入口地址

示例1——自定義結束函數:

#include <iostream> #include <cstdlib> #include <exception>using namespace std;void my_terminate() {cout << "void my_terminate()" << endl;exit(1); }class Test { public:Test() {cout << "Test()"; cout << endl;}~Test() {cout << "~Test()"; cout << endl;} };int main() {set_terminate(my_terminate);static Test t;throw 1;return 0; }

運行結果為:

[root@bogon Desktop]# g++ test.cpp [root@bogon Desktop]# ./a.out Test() void my_terminate() ~Test()

將exit(1);改為abort();后的運行結果:
示例2——自定義結束函數:

void my_terminate() {cout << "void my_terminate()" << endl;// exit(1);abort(); }

運行結果為:

[root@bogon Desktop]# g++ test.cpp [root@bogon Desktop]# ./a.out Test() void my_terminate() Aborted (core dumped)

(abort()函數是異常終止一個程序,并且異常終止的時候不會調用任何對象的析構函數。如果調用的是exit()函數,那么會確保所有的全局對象和靜態局部對象的析構函數被調用。)

面試題:
如果析構函數中拋出異常會發生什么情況?

示例——析構函數拋出異常:

#include <iostream> #include <cstdlib> #include <exception>using namespace std;void my_terminate() {cout << "void my_terminate()" << endl;exit(1); }class Test { public:Test(){cout << "Test()";cout << endl;}~Test(){cout << "~Test()";cout << endl;throw 2;} };int main() {set_terminate(my_terminate);static Test t;throw 1;return 0; }

運行結果為:

[root@bogon Desktop]# g++ test.cpp [root@bogon Desktop]# ./a.out Test() void my_terminate() ~Test() Aborted (core dumped)

(析構函數中不能拋出異常,可能導致 terminate() 多次調用)
(不同編譯器之間在默認的 terminate() 函數實現上有差異。)

3.小結

  • 如果異常沒有被處理,最后 terminate() 結束整個程序
  • terminate() 是整個程序釋放系統資源的最后機會
  • 結束函數可以自定義,但不能繼續拋出異常
  • 析構函數中不能拋出異常,可能導致 terminate() 多次調用

轉載于:https://www.cnblogs.com/PyLearn/p/10103115.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的C++解析-外传篇(1):异常处理深度解析的全部內容,希望文章能夠幫你解決所遇到的問題。

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