c++ try_catch throw

使用throw拋出異常


本人節選自《21天學通C++》一書
??? 拋出異常(也稱為拋棄異常)即檢測是否產生異常,在C++中,其采用throw語句來實現,如果檢測到產生異常,則拋出異常。該語句的格式為:
throw 表達式;
??? 如果在try語句塊的程序段中(包括在其中調用的函數)發現了異常,且拋棄了該異常,則這個異常就可以被try語句塊后的某個catch語句所捕獲并處理,捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。由于C++使用數據類型來區分不同的異常,因此在判斷異常時,throw語句中的表達式的值就沒有實際意義,而表達式的類型就特別重要。
【范例20-2】處理除數為0的異常。該范例將上述除數為0的異常可以用try/catch語句來捕獲異常,并使用throw語句來拋出異常,從而實現異常處理,實現代碼如代碼清單20-2所示。
代碼清單20-2
1??? #include<iostream.h>???????????????????????????????? //包含頭文件
2??? #include<stdlib.h>
3??? double fuc(double x, double y)??????????????????????? //定義函數
4??? {
5??????? if(y==0)
6??????? {
7??????????? throw y;??????????????????????????????????? //除數為0,拋出異常
8??????? }
9??????? return x/y;??????????????????????????????????? //否則返回兩個數的商
10??? }
11??? void main()
12??? {
13??????? double res;
14??????? try??????????????????????????????????????????? //定義異常
15??????? {
16??????????? res=fuc(2,3);
17??????????? cout<<"The result of x/y is : "<<res<<endl;
18??????????? res=fuc(4,0);??????????????????????????????? //出現異常
19??????? }
20??????? catch(double)??????????????????????????????????? //捕獲并處理異常
21??????? {
22??????????? cerr<<"error of dividing zero.\n";
23??????????? exit(1);??????????????????????????????????? //異常退出程序
24??????? }
25??? }
【運行結果】在Visual C++中新建一個【C++ Source File】文件,輸入上述的代碼,編譯無誤后運行。
【范例解析】上述代碼中,在主函數main()的第14~19行中使用了try語句定義異常,其中包含3條有可能出現異常的語句,它們為調用兩個數相除的函數。在代碼的第20~24行定義了異常處理,即捕獲異常后執行該段代碼中的語句。此外,在函數fuc()的代碼5~8行通過throw語句拋出異常。

注意:一般來說,throw語句通常與try- catch或try-finally語句一起使用,可以使用throw語句顯式引發異常。

c++ try_catch
?
1、基礎介紹
try
{
//程序中拋出異常
throw value;
}
catch(valuetype v)
{
//例外處理程序段
}
語法小結:throw拋出值,catch接受,當然,throw必須在“try語句塊”中才有效。

2、深入throw:
(i)、程序接受到throw語句后就會自動調用析構器,把該域(try后的括號內)對象clean up,然后再進
入catch語句(如果在循環體中就退出循環)。

這種機制會引起一些致命的錯誤,比如,當“類”有指針成員變量時(又是指針!),在 “類的構建器
”中的throw語句引起的退出,會導致這個指針所指向的對象沒有被析構。這里很基礎,就不深入了,提
示一下,把指針改為類就行了,比如模板類來代替指針,在模板類的內部設置一個析構函數。

(ii)、語句“throw;”拋出一個無法被捕獲的異常,即使是catch(...)也不能捕捉到,這時進入終止函數
,見下catch。

3、深入catch:
一般的catch出現的形式是:
try{}
catch(except1&){}
catch(except2&){}
catch(...){} //接受所有異常
一般都寫成引用(except1&),原因很簡單,效率。

問題a:拋出異常,但是catch不到異常怎么辦?(注意沒有java類似的finally語句
在catch沒有捕獲到匹配的異常的時候,會調用默認的終止函數。可以調用set_terminate()來設置終止函數,參數是一個函數指針,類型是:void (*terminate)()。

到這里,可以題個問題:“沒有try-catch,直接在程序中"throw;",會怎么樣?”


其他一些技巧:
4、try一個函數體,形式如下
void fun(type1,type2) try----try放在函數體后
{
?? 函數定義
}
catch(typeX){}
這個用法的效果就相當于:
void fun()
{
?? try{函數定義}
}


5、throw一個函數體,形式如下:
void fun (); // 能拋出任何類型的異常
void fun () throw(except1,except2,except3)
?????????????? // 后面括號里面是一個異常參數表,本例中只能拋出這3中異常
void fun () throw()?? // 參數表為空,不能拋出異常

問題b:假設fun()中拋出了一個不在“異常參數表”中的異常,會怎么樣?

答:調用set_terminate()中設定的終止函數。然而,這只是表面現象,實際上是調用默認的unexpected()函數,然而這個默認的unexpected()調用了set_terminate()中設定的終止函數。可以用set_unexpected()來設置unexpected,就像set_terminate()一樣的用法,但是在設定了新的“unexpected()”之后,就不會再調用set_terminater中設定的終止函數了。

這個語法是很有用的,因為在用別人的代碼時,不知道哪個地方會調用什么函數又會拋出什么異常,用一個異常參數表在申明時限制一下,很實用。


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

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

相關文章

數字證書和數字簽名

什么是數字證書&#xff1f;由于Internet網電子商務系統技術使在網上購物的顧客能夠極其方便輕松地獲得商家和企業的信息,但同時也增加了對某些敏感或有價值的數據被濫用的風險. 為了保證互聯網上電子交易及支付的安全性,保密性等&#xff0c;防范交易及支付過程中的欺詐行為&a…

域名劫持

轉載于:https://www.cnblogs.com/xinghen1216/p/8548323.html

cesium html源碼,Cesium源碼的本地運行及調試

CesiumJS源碼運行有兩種方式&#xff1a;基于node.js運行官方下載地址&#xff1a;https://cesium.com/cesiumjs/下載解壓后&#xff0c;在根目錄安裝依賴后&#xff0c;就可直接運行npm initnpm start如果調試代碼呢&#xff0c;官方的示例都是在Sandcastle里放著&#xff0c;…

Diango博客--13.將“視圖函數”類轉化為“類視圖”

文章目錄0.思路引導1.ListView2.將 index 視圖函數改寫為類視圖3.將 category 視圖函數改寫為類視圖4.將 archive 視圖函數改寫成類視圖5.將 tag 視圖函數改寫成類視圖6.DetailView7.將DetailView視圖函數改寫成類視圖0.思路引導 1&#xff09;在開發網站的過程中&#xff0c;…

es6之數據結構 set,WeakSet,mapWeakMap

{let list new Set();list.add(1);list.add(2);list.add(1);console.log(list); //Set(2) {1, 2} let arr[1,2,3,1,2] let list2new Set(arr); console.log(list2); //Set(3) {1, 2, 3} } Set ES6 提供了新的數據結構 Set。它類似于數組&#xff0c;但是成員的值都是唯一的&a…

關于C語言中繼承和多態的實現

以下的內容綜合了多篇文章&#xff0c;加上一點自己的理解而成。目的為了給自己閱讀他們文章后做一個筆記。在末尾給出了這些文章的地址。 多態的實現可以采用以下幾種方式&#xff1a; (1)使用 vod * (萬能指針)來實現“編譯時多態”。 (2)使用函數指針來實現“運行時…

邊界測試

邊界條件邊界測試是單元測試中最后的也可能是最重要的任務。 軟件常常在它的邊界上失效&#xff0c;例如&#xff0c;處理n元數組的第n個元素時&#xff0c;或做到i次循環中的第i次重復時&#xff0c;往往會發生錯誤。 使用剛好小于、剛好等于和剛好大于最大值或最小值的數據結…

阿里云上Kubernetes集群聯邦

摘要&#xff1a; kubernetes集群讓您能夠方便的部署管理運維容器化的應用。但是實際情況中經常遇到的一些問題&#xff0c;就是單個集群通常無法跨單個云廠商的多個Region&#xff0c;更不用說支持跨跨域不同的云廠商。這樣會給企業帶來一些擔憂&#xff0c;如何應對可用區級別…

缺氧游戲計算機,缺氧PC最低什么配置一覽 你覺得高嗎

缺氧PC最低什么配置一覽&#xff0c;你覺得高嗎。游戲對于電腦有不同程度的要求&#xff0c;缺氧這款游戲也有著自己的配置要求&#xff0c;看看下面的缺氧PC最低什么配置一覽&#xff0c;你的硬件夠得上嗎。缺氧最低配置&#xff1a;首先公布的是官 方配置需求&#xff0c;目前…

Diango博客--14.使用 Django 項目中的 ORM 編寫偽造測試數據腳本

文章目錄0.思路引導1.腳本目錄結構2.使用 Faker 快速生成測試數據3.批量生成測試數據4.執行腳本5.效果展示0.思路引導 1&#xff09;為了防止博客首頁展示的文章過多以及提升加載速度&#xff0c;可以對文章列表進行分頁展示。 2&#xff09;不過這需要比較多的文章才能達到分…

基于Sql Server 2008的分布式數據庫的實踐

配置Sql Server 2008&#xff08;Win7&#xff09; 1.打開SQL server2012&#xff0c;使用windows身份登錄 2.登錄后&#xff0c;右鍵選擇“屬性”。左側選擇“安全性”&#xff0c;選中右側的“SQL Server 和 Windows 身份驗證模式”以啟用混合登錄模式 3.選擇“連接”&#x…

橫向技術分析C#、C++和Java優劣

本文將從技術人員的角度橫向分析C#、C和Java優劣&#xff0c;其實選擇Java陣營還是.NET陣營&#xff0c;大家可以根據自己的實際需要來確定。 C#誕生之日起&#xff0c;關于C#與Java之間的論戰便此起彼伏&#xff0c;至今不輟。拋卻Microsoft與Sun之間的恩怨與口角&#xff0c;…

軟件測試中的存根程序

存根程序用來代替被測試的模塊所調用的模塊&#xff0c;因此存根程序也稱為“虛擬子程序”&#xff0c;它利用被它代替的模塊的接口&#xff0c;只做盡可能少的數據操作。

計算機網絡應用云計算,計算機網絡云計算的類型

原標題&#xff1a;計算機網絡云計算的類型隨著現代計算機網絡技術的不斷發展&#xff0c;越來越多的與計算機網絡有關的現代化技術得以出現&#xff0c;并且有著廣泛的應用&#xff0c;其中云計算技術就是比較常見的一種&#xff0c;在實際應用中發揮著較高的價值。在信息時代…

sublime_text快捷鍵

1、注釋&#xff1a;選中文本后&#xff0c;CTRL / 2、CTRL N,CTRLS&#xff0c;保存成.html文件后&#xff0c;只需要輸入感嘆號&#xff01;&#xff0c;然后tab鍵&#xff0c;即可打印出基本的html格式&#xff01;轉載于:https://www.cnblogs.com/JAVA-STUDYER/p/855040…

Diango博客--15.通過 Django Pagination 實現簡單分頁(一)

文章目錄0.思路引導1.Paginator 類的常用方法2.用 Paginator 給文章列表分頁3.在模板中設置分頁導航4.效果展示0.思路引導 1&#xff09;當博客上發布的文章越來越多時&#xff0c;通常需要進行分頁顯示&#xff0c;以免所有的文章都堆積在一個頁面&#xff0c;影響用戶體驗。…

SpringMVC 測試 mockMVC

SpringMVC測試框架 基于RESTful風格的SpringMVC的測試&#xff0c;我們可以測試完整的Spring MVC流程&#xff0c;即從URL請求到控制器處理&#xff0c;再到視圖渲染都可以測試。 一 MockMvcBuilder MockMvcBuilder是用來構造MockMvc的構造器&#xff0c;其主要有兩個實現&…

自頂向下和自底向上測試的優缺點

自頂向下測試方法的主要優點是不需要測試驅動程序&#xff0c;能夠在測試階段的早期實現并驗證系統的主要功能&#xff0c;而且能在早期發現上層模塊的接口錯誤。 自頂向下測試方法的主要缺點是需要存根程序&#xff0c;可能遇到與此相聯系的測試困難&#xff0c;低層關鍵模塊中…

C++ class中的靜態(static)成員

C class中的靜態(static)成員 &#xff08;1&#xff09; 靜態數據成員 ①一般地靜態數據成員在該類定義之外被初始化&#xff0c;如同一個成員函數被定義在類定義之外一樣。在這種定義中的靜態成員的名字必須被其類名限定修飾&#xff0c;例如下面是_interestRate的初始…

用計算機彈可惜不是你,可惜不是你 還是幸虧不是你

一、 你沒有再挽留 我也沒有再回頭 就這樣 無風無雨也無晴 無疾而終二、 是我孤陋寡聞不知你心有人三、 如果作業有葬禮,全體學生定當盛裝出席.四、 縱使我有千般好 你也看不到 因為你沒有一雙愛我的眼睛五、 原來暫時共你沒緣分 來年先會變得更合襯六、 真的別回頭 你有未來 你…