本文接著上篇文章的《異常處理機制之基本思想》,將講解代碼的具體實現。
異常基本語法
- 1) 若有異常則通過throw操作創建一個異常對象並拋擲。
- 2) 將可能拋出異常的程序段嵌在try塊之中。控制通過正常的順序執行到達try語句,然後執行try塊內的保護段。
- 3) 如果在保護段執行期間沒有引起異常,那麼跟在try塊後的catch子句就不執行。程序從try塊後跟隨的最後一個catch子句後面的語句繼續執行下去。
- 4) catch子句按其在try塊後出現的順序被檢查。匹配的catch子句將捕獲並處理異常(或繼續拋擲異常)。
- 5) 如果匹配的處理器未找到,則運行函數terminate將被自動調用,其缺省功能是調用abort終止程序。
- 6)處理不了的異常,可以在catch的最後一個分支,使用throw語法,向上扔。
案例1:被零整除案例
案例2:
throw A將穿透函數f,g和main,抵達系統的最後一道防線——激發terminate函數.
該函數調用引起運行終止的abort函數.
最後一道防線的函數可以由程序員設置.從而規定其終止前的行為.
修改系統默認行為:
- 可以通過set_terminate函數修改捕捉不住異常的默認處理器,從而使得發生捉不住異常時,被自定義函數處理:
- void myTerminate(){cout<
- set_terminate(myTerminate);
- set_terminate函數在頭文件exception中聲明,參數為函數指針void(*)().
案例3:
構造函數沒有返回類型,無法通過返回值來報告運行狀態,所以只通過一種非函數機制的途徑,即異常機制,來解決構造函數的出錯問題。
- 7)異常機制與函數機制互不干涉,但捕捉的方式是基於類型匹配。捕捉相當於函數返回類型的匹配,而不是函數參數的匹配,所以捕捉不用考慮一個拋擲中的多種數據類型匹配問題,例如:
catch代碼塊必須出現在try後,並且在try塊後可以出現多個catch代碼塊,以捕捉各種不同類型的拋擲。
異常機制是基於這樣的原理:程序運行實質上是數據實體在做一些操作,因此發生異常現象的地方,一定是某個實體出了差錯,該實體所對應的數據類型便作為拋擲和捕捉的依據。
- 8)異常捕捉嚴格按照類型匹配
異常捕捉的類型匹配之苛刻程度可以和模板的類型匹配媲美,它不允許相容類型的隱式轉換,比如,拋擲char類型用int型就捕捉不到.例如下列代碼不會輸出“int exception.”,從而也不會輸出“That’s ok.” 因為出現異常後提示退出
下面是本人整理的鏈接,能夠幫助大家快速尋找文章。
【C++進階篇系列】
【Linux系統篇系列】
【C++知識點系列】
【高級網絡編程系列】
喜歡我的文章的話,就關注我吧!不要只收藏和轉發哦,每天至少兩篇編程知識給大家,都是本人多年的經驗總結!
閱讀更多 cpp軟件架構獅 的文章