c++ primer plus 第15章友,異常和其他:異常,15.3.7 其他異常特性

c++ primer plus 第15章友,異常和其他:異常,15.3.7 其他異常特性

c++ primer plus 第15章友,異常和其他:異常,15.3.7 其他異常特性

文章目錄

  • c++ primer plus 第15章友,異常和其他:異常,15.3.7 其他異常特性


15.3.7 其他異常特性
雖然 throw-catch 機制類似于函數參數和函數返回機制,但還是有些不同之處。其中之一是函數 fun()中的返回語句將控制權返回到調用 fun()的函數,但throw 語句將控制權向上返回到第一個這樣的函數:包含能夠捕獲相應異常的try-catch 組合。例如,在程序清單15.12中,當函數hmeans()引發異常時,控制權
將傳遞給函數 means();然而,當 gmean()引發異常時,控制權將向上傳遞到 main()。另一個不同之處是,引發異常時編譯器總是創建一個臨時拷貝,即使異常規范和catch塊中指定的是引用。例如,請看下面的代碼:

class problem(...);
void super()throw(problem)
{...if (oh_no)problem oops;//construct objectthrow oops;// throw it...}
try{
super();
catch(problem&p)
//statements
}

p將指向 oops的副本而不是 oops本身。這是件好事,因為函數 super()執行完畢后,oops 將不復存在。順便說一句,將引發異常和創建對象組合在一起將更簡單:

throw problem();//construct and throw default problem object

您可能會問,既然 throw 語句將生成副本,為何代碼中使用引用呢?畢竟,將引用作為返回值的通常原因是避免創建副本以提高效率。答案是,引用還有另一個重要特征:基類引用可以執行派生類對象。假設有一組通過繼承關聯起來的異常類型,則在異常規范中只需列出一個基類引用,它將與任何派生類對象匹配。假設有一個異常類層次結構,并要分別處理不同的異常類型,則使用基類引用將能夠捕獲任何異常對象;而使用派生類對象只能捕獲它所屬類及從這個類派生而來的類的對象。引發的異常對象將被第一個與之匹配的 catch 塊捕獲。這意味著catch 塊的排列順序應該與派生順序相反:

class bad 1{...};
class bad 2:public bad 1(...};
class bad 3:public bad 2{...};
...
void duper()
{
i f(oh_no)throw bad 1();
if (rats)throw bad 2();
if (drat)throw bad 3();
}
try{
duper();
catch(bad 3 &be)// statements
catch(bad 2 &be)(//statements
catch(bad 1 &be)// statements
}

如果將 bad 1&處理程序放在最前面,它將捕獲異常bad_1、bad2和 bad 3;通過按相反的順序排列,bad3異常將被bad3&處理程序所捕獲,
提示:如果有一個異常類繼承層次結構,應這樣排列 catch 塊:將捕獲位于層次結構最下面的異常類的 catch語句放在最前面,將捕獲基類異常的catch 語句放在最后面。
通過正確地排列 catch塊的順序,讓您能夠在如何處理異常方面有選擇的余地。然而,有時候可能不知道會發生哪些異常。例如,假設您編寫了一個調用另一個函數的函數,而您并不知道被調用的函數可能引發哪些異常。在這種情況下,仍能夠捕獲異常,即使不知道異常的類型。方法是使用省略號來表示異常類型,從而捕獲任何異常:

catch(...){//statements)// catches any type exception

如果知道一些可能會引發的異常,可以將上述捕獲所有異常的catch塊放在最后面,這有點類似于switch 語句中的 default:

try{
duper();
}
catch(bad 3 &be)//statements
catch(bad 2 &be)//statements
catch(bad 1 &be)// statements
catch(bad hmean &h)
//statement
scatch(..)//statements
//catch whatever is left

可以創建捕獲對象而不是引用的處理程序。在catch語句中使用基類對象時,將捕獲所有的派生類對象,但派生特性將被剝去,因此將使用虛方法的基類版本。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42621.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sorted Set 類型命令(命令語法、操作演示、命令返回值、時間復雜度、注意事項)

Sorted Set 類型 文章目錄 Sorted Set 類型zadd 命令zrange 命令zcard 命令zcount 命令zrevrange 命令zrangebyscore 命令zpopmax 命令bzpopmax 命令zpopmin 命令bzpopmin 命令zrank 命令zscore 命令zrem 命令zremrangebyrank 命令zremrangebyscore 命令zincrby 命令zinterstor…

線程池案例

秒殺 需求 10個禮物20個客戶搶隨機10個客戶獲取禮物&#xff0c;另外10無法獲取禮物 任務類 記得給共享資源加鎖 public class MyTask implements Runnable{// 禮物列表private ArrayList<String> gifts ;// 用戶名private String username;public MyTask( String user…

android Dialog全屏沉浸式狀態欄實現

在Android中&#xff0c;創建沉浸式狀態欄通常意味著讓狀態欄背景與應用的主題顏色一致&#xff0c;并且讓對話框在狀態欄下面顯示&#xff0c;而不是浮動。為了實現這一點&#xff0c;你可以使用以下代碼片段&#xff1a; 1、實際效果圖&#xff1a; 2、代碼實現&#xff1a;…

揭秘GPT-4o:未來智能的曙光

引言 近年來&#xff0c;人工智能&#xff08;AI&#xff09;的發展突飛猛進&#xff0c;尤其是自然語言處理&#xff08;NLP&#xff09;領域的進步&#xff0c;更是引人注目。在這一背景下&#xff0c;OpenAI發布的GPT系列模型成為了焦點。本文將詳細探討最新的模型GPT-4o&a…

Unity海面效果——6、反射和高光

Unity引擎制作海面效果 大家好&#xff0c;我是阿趙。 上一篇的結束時&#xff0c;海面效果已經做成這樣了&#xff1a; 這個Shader的復雜程度已經比較高了&#xff1a; 不過還有一些美中不足的地方。 1、 海平面沒有反射到天空球 2、 在近岸邊看得到水底的部分&#xff0c;水…

JVM調優:深入理解與實戰指南

引言 Java虛擬機&#xff08;JVM&#xff09;作為Java應用程序的運行環境&#xff0c;其性能直接影響到應用程序的響應速度、吞吐量和穩定性。JVM調優是Java開發者必須掌握的一項關鍵技能&#xff0c;它能夠幫助我們更好地利用系統資源&#xff0c;提升應用程序的性能。本文將…

一些關于C++的基礎知識

引言&#xff1a;C兼容C的大部分內容&#xff0c;但其中仍有許多小細節的東西需要大家注意 一.C的第一個程序 #include <iostream> using namespace std;int main() {cout << "hello world!" << endl;return 0; } 第一次看這個是否感覺一頭霧水…

數據挖掘——matplotlib

matplotlib概述 Mat指的是Matlab&#xff0c;plot指的是畫圖&#xff0c;lib即library&#xff0c;顧名思義&#xff0c;matplotlib是python專門用于開發2D圖表的第三方庫&#xff0c;使用之前需要下載該庫&#xff0c;使用pip命令即可下載。 pip install matplotlib1、matpl…

elasticsearch SQL:在Elasticsearch中啟用和使用SQL功能

?博主首頁 &#xff1a; 「碼到三十五」 &#xff0c;同名公眾號 :「碼到三十五」&#xff0c;wx號 : 「liwu0213」 ?博主專欄 &#xff1a; <mysql高手> <elasticsearch高手> <源碼解讀> <java核心> <面試攻關> ?博主的話 &#xff1a…

服務注冊Eureka

目錄 一、背景 1、概念 2、CAP 理論 3、常見的注冊中心 二、Eureka 三、搭建 Eureka Server 1、搭建注冊中心 四、服務注冊 五、服務發現 六、Eureka 和 Zooper 的區別 一、背景 1、概念 遠程調用就類似于一種通信 例如&#xff1a;當游客與景區之間進行通信&…

代碼隨想錄算法訓練營第六十三天 | prim算法、kruskal算法、復習

53. 尋寶 — prim算法 題目鏈接&#xff1a;https://kamacoder.com/problempage.php?pid1053 文檔講解&#xff1a;https://programmercarl.com/kamacoder/0053.%E5%AF%BB%E5%AE%9D-prim.html 思路 本題是最小生成樹的模板題&#xff0c;最小生成樹可以使用 prim算法&#xf…

bash shell 重定向輸入和輸出

shell 提供的重定向操作符 操作符作用>將命令的輸出發到一個文件中如果文件存在&#xff0c;則新的文件數據會覆蓋已經存在的文件>>將命令的輸出追加到一有文件如果文件不存在&#xff0c;則創建新的文件<將文件內容重定向到命令<<內聯輸入重定向(inline in…

Xubuntu24.04之設置高性能模式兩種方式(二百六十一)

簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長! 優質專欄:Audio工程師進階系列【原創干貨持續更新中……】?? 優質專欄:多媒體系統工程師系列【原創干貨持續更新中……】?? 優質視頻課程:AAOS車載系統+AOSP…

蒼穹外賣--新增員工

代碼開發 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.entity.Employee; import com.sky.properties.JwtProperties; import com.sky.result.Result…

Springboot各個版本維護時間

Springboot各個版本維護時間

MQTT教程--服務器使用EMQX和客戶端使用MQTTX

什么是MQTT MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一種輕量級、基于發布-訂閱模式的消息傳輸協議&#xff0c;適用于資源受限的設備和低帶寬、高延遲或不穩定的網絡環境。它在物聯網應用中廣受歡迎&#xff0c;能夠實現傳感器、執行器和其它設備…

【Linux】shell基礎知識點(updating)

1.輸出重定向2.多命令批量執行&#xff08;; 、&&、 ||&#xff09;3.腳本不同方式執行的區別&#xff08;source、bash、sh、./&#xff09;4.理解環境變量5.export6.引號的使用last.命令相關 1.輸出重定向 3種數據流&#xff1a; stdin&#xff1a;標準輸入&#xf…

jmeter持續學習之----性能初級一些概念和指標

服務端為什么要進行性能測試 大量用戶下&#xff0c;系統能否穩定運行&#xff08;比較多&#xff09; 用于硬件服務器的選型 用于軟件技術的選型 性能測試關注的點 用戶角度:響應時間 資源占用:并發用戶數,TPS,資源占用(cpu,內存,JVM) 性能測試策略 基準測試:單用戶測試,對…

去了字節跳動,才知道年薪40W的測試有這么多?

最近脈脈職言區有一條討論火了&#xff1a; 哪家互聯網公司薪資最‘厲害’&#xff1f; 下面的評論多為字節跳動&#xff0c;還炸出了很多年薪40W的測試工程師 我只想問一句&#xff0c;現在的測試都這么有錢了嗎&#xff1f; 前幾天還有朋友說&#xff0c;從騰訊跳槽去了字節&…

8.8.8.8 IP地址的作用

在跟著韋東山老師的學習手冊中看見了關于8.8.8.8 IP用于檢測網絡狀態&#xff0c;然后搜索了關于此IP的相關作用如下&#xff1a; 公共DNS服務&#xff1a;8.8.8.8是Google提供的兩個公共DNS服務器地址之一&#xff08;另一個是8.8.4.4&#xff09;。DNS&#xff08;域名系統&a…