70 異常處理深度解析

2021-10-09 16:34:00 字數 2302 閱讀 4010

注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。

測試環境:ubuntu 10.10

gcc版本:9.2.0

一、異常處理深度解析

1)問題

如果在main函式中丟擲異常會發生什麼?

2)如果異常不處理,最後會傳到**?

3)下面的**輸出什麼?

程式設計實驗

異常的最終處理?

e1-1.cpp

#include using namespace std;

class test

~test()

};int main()

操作:g++編譯,編譯正常。列印結果:

test()

terminate called after throwing an instance of 'int' 

aborted(core dumped)

4)如果異常無法被處理,terminate()結束函式會被自動呼叫

5)預設情況下,terminate()呼叫庫函式abort()終止程式。

6)abort()函式使得程式執行異常而立即退出

7)c++支援替換預設的terminate()函式實現

8)terminate()函式的替換

-    自定義乙個無返回值無引數的函式

*不能丟擲任何異常

*必須以某種方式結束當前程式

-    呼叫set_terminate()設定自定義的結束函式

*引數型別為void(*)()

*返回值為預設的terminate()函式入口位址

程式設計實驗

自定義結束函式

e1-2.cpp

#include #include #include //異常處理相關東西

using namespace std;

void my_terminate()

class test

~test()

};int main()

操作:

1)g++編譯(使用exit),編譯正常。列印結果:

test()

void my_terminate()

~test() //來自static test t的析構函式

2)g++編譯(使用abort),編譯正常。列印結果:

test()

void my_terminate()

兩個重要知識點

1、main函式裡的異常,如果沒有沒處理,會被乙個全域性的函式給處理掉。

2、c++編譯器之間存在差異(對異常處理已經證明)

面試題如果析構函式中丟擲異常會發生什麼情況?

1、析構函式是釋放資源的地方,如果丟擲異常,導致資源不能正確釋放。

2、導致全域性結束函式terminate()重複呼叫,使系統進入不穩定狀態。

程式設計實驗

析構函式丟擲異常

e1-3.cpp

#include #include #include using namespace std;

void my_terminate()

class test

~test()

};int main()

操作:

1)g++編譯正常,列印結果:

test()

void my_terminate()    //解決throw 1

~test()                //解決throw 1異常時,觸發exit(1),然後呼叫析構函式

void my_terminate()    //丟擲異常throw 2,再次觸發異常處理函式,列印這個結果

之所以預設呼叫abort()函式,為了強制終止程式,防止呼叫析構函式時再次釋放資源

小結1)如果異常沒有被處理,最後terminate()結束整個程式

2)terminate()是整個程式釋放系統資源的最後機會

3)結束函式可以自定義,但不能繼續丟擲異常

4)析構函式中不能丟擲異常,可能導致terminate()多次呼叫

深度解析Java執行緒池的異常處理機制

今天小夥伴遇到個小問題,執行緒池提交的任務如果沒有catch異常,那麼會拋到 去,之前倒是沒研究過,本著實事求是的原則,看了一下 考慮下面這段 有什麼區別呢?你可以猜猜會不會有異常打出呢?如果打出來的話是在 executorservice threadpool executors.newfixedt...

C 深度解析 46 C 中的異常處理(上)

4 小結 程式在執行過程中可能產生異常,異常與 bug 的區別在於,異常是程式執行時可預料的執行分支,bug 是程式中的錯誤,是不被預期的執行方式。下面列舉幾個常見的異常與 bug。異常 bugc 內建了異常處理的語法元素 try catch c 通過 throw 語句丟擲異常資訊 舉例如下 div...

深度學習異常檢測 深度few shot異常檢測

入門,利用一些標記的異常例項執行異常通知的異常檢測 由於缺乏大規模的標記異常資料,現有的 深度或淺度 異常檢測方法通常被設計為無監督學習 針對完全未標記的資料進行訓練 或半監督學習 針對僅標記的正常資料進行訓練 結果,當在許多現實世界中的異常檢測應用中可獲得這樣的資訊時,他們難以利用先驗知識 例如,...