C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常
1. catch 子句 (catch clause) 中的異常聲明(exception declaration)
聲明的類型決定了處理代碼所能捕獲的異常類型。
這個類型必須是完全類型, 它可以是左值引用, 但不能是右值引用
1.1 catch 的參數類型可以是引用類型或非引用類型
如果 catch 的參數是基類類型, 則我們可以使用其派生類類型的異常對象對其進行初始化。 此時, 如果 catch 的參數是非引用類型, 則異常對象將被切掉一部分
異常聲明的靜態類型將決定 catch 語句所能執行的操作。如果 catch 的參數是基類類型, 則 catch 無法使用派生類特有的任何成員。
1.2 查找匹配的處理代碼
在搜尋 catch 語句的過程中, 我們最終找到的 catch 未必是異常的最佳匹配。 相反,挑選出來的應該是第一個與異常匹配的 catch 語句。 因此, 越是專門的 catch 越應該置于整個 catch 列表的前端
絕大多數類型轉換都不被允許, 除了一些極細小的差別之外:
- 允許從非常量向常量的類型轉換, 也就是說, 一條非常量對象的 throw 語句可以匹配一個接受常量引用的 catch 語句。
- 允許從派生類向基類的類型轉換。
- 數組被轉換成指向數組( 元素) 類型的指針, 函數被轉換成指向該函數類型的指針
1.3 重新拋出
一條 catch 語句通過重新拋出 (rethrowing) 的操作將異常傳遞給另外一個 catch 語句。 這里的重新拋出
仍然是一條 throw 語句, 只不過不包含任何表達式:
throw;
1.4 .捕獲所有異常 (catch-all)
使用省略號作為異常聲明,如 catch (… )
catch(…);一條語句可以和任意類型的異常對象匹配。
它經常和重新拋出語句一起使用,其中catch執行完當前局部能夠完成的工作之后,重新拋出異常。
{void manip () {try {// 這里的操作將引發并拋出一個異常} catch (...) {// 處理異常的某一些操作throw;}}// catch(...)既可以單獨出現// 也可以和其他的catch一起出現// 如果和其他的catch一起出現// 則它必須放在最后的位置// 否則放在捕獲所有異常的catch語句之后的catch語句永遠不會被執行 }總結
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha