c++異常處理機制

c++異常處理機制

C++異常處理機制是一個用來有效地處理運行錯誤的非常強大且靈活的工具,它提供了更多的彈性、安全性和穩固性,克服了傳統方法所帶來的問題.

異常的拋出和處理主要使用了以下三個關鍵字:?try、?throw?、?catch?。

拋出異常即檢測是否產生異常,在C++中,其采用throw語句來實現,如果檢測到產生異常,則拋出異常。該語句的格式為:
throw?表達式;
如果在try語句塊的程序段中(包括在其中調用的函數)發現了異常,且拋棄了該異常,則這個異常就可以被try語句塊后的某個catch語句所捕獲并處 理,捕獲和處理的條件是被拋棄的異常的類型與catch語句的異常類型相匹配。由于C++使用數據類型來區分不同的異常,因此在判斷異常時,throw語 句中的表達式的值就沒有實際意義,而表達式的類型就特別重要。

try-catch語句形式如下 :


try
{
????????包含可能拋出異常的語句;
}
catch(類型名?[形參名])?//?捕獲特定類型的異常
{

}
catch(類型名?[形參名])?//?捕獲特定類型的異常
{

}
catch(...)????//?
三個點則表示捕獲所有類型的異常
{
}



【范例1】處理除數為0的異常。該范例將上述除數為0的異常可以用try/catch語句來捕獲異常,并使用throw語句來拋出異常,從而實現異常處理,實現代碼如代碼清單1-1所示。
//?代碼清單1-1

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)?????????????//捕獲并處理異常 【throw y的類型為double,捕獲的類型為double】
21????????????????{
22????????????????????????cerr<<"error of dividing zero./n";
23????????????????????????exit(1);????????????????//異常退出程序
24????????????????}
25????????}


【范例2】自定義異常類型 (在本文開始的代碼中已經給出示范)

三、異常的接口聲明

為了加強程序的可讀性,使函數的用戶能夠方便地知道所使用的函數會拋出哪些異常,可以在函數的聲明中列出這個函數可能拋出的所有異常類型,例如:

void?fun()?throw( A,B,C,D);

這表明函數fun()可能并且只可能拋出類型(A,B,C,D)及其子類型的異常。

如果在函數的聲明中沒有包括異常的接口聲明,則此函數可以拋出任何類型的異常,例如:

void?fun();


一個不會拋出任何類型異常的函數可以進行如下形式的聲明:

void?fun() thow();

??????
五、異常處理中需要注意的問題

1.?如果拋出的異常一直沒有函數捕獲(catch),則會一直上傳到c++運行系統那里,導致整個程序的終止

2.?一般在異常拋出后資源可以正常被釋放,但注意如果在類的構造函數中拋出異常,系統是不會調用它的析構函數的,處理方法是:如果在構造函數中要拋出異常,則在拋出前要記得刪除申請的資源。

3.?
異常處理僅僅通過類型而不是通過值來匹配的,所以catch塊的參數可以沒有參數名稱,只需要參數類型。

4.?函數原型中的異常說明要與實現中的異常說明一致,否則容易引起異常沖突。

5.?應該在throw語句后寫上異常對象時,throw先通過Copy構造函數構造一個新對象,再把該新對象傳遞給?catch.?


那么當異常拋出后新對象如何釋放?

異常處理機制保證:異常拋出的新對象并非創建在函數棧上,而是創建在專用的異常棧上,因此它才可以跨接多個函數而傳遞到上層,否則在棧清空的過程中就會被 銷毀。所有從try到throw語句之間構造起來的對象的析構函數將被自動調用。但如果一直上溯到main函數后還沒有找到匹配的catch塊,那么系統 調用terminate()終止整個程序,這種情況下不能保證所有局部對象會被正確地銷毀。

6. catch塊的參數推薦采用地址傳遞而不是值傳遞,不僅可以提高效率,還可以利用對象的多態性。另外,派生類的異常撲獲要放到父類異常撲獲的前面,否則,派生類的異常無法被撲獲。

7.?編寫異常說明時,要確保派生類成員函數的異常說明和基類成員函數的異常說明一致,即派生類改寫的虛函數的異常說明至少要和對應的基類虛函數的異常說明相同,甚至更加嚴格,更特殊。

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

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

相關文章

html標簽api,html5新增標簽+API介紹

新增標簽1、embedembed標簽是html5新增的標簽&#xff0c;用來嵌入內容&#xff0c;比如插件等&#xff0c;常用于視頻文件的播放(為外部應用程序定義容器)。這篇文章介紹了embed的常用屬性&#xff0c;基本都是定義播放器的一些設置的&#xff0c;自動播放loop、開始時間start…

UVA10404

1 //題意&#xff1a;S 和 O 二人玩游戲 。N顆石頭&#xff0c;M個數&#xff0c;每次拿 M[i]個石頭&#xff08;i>0 && i<m) ,誰拿到最后一個誰贏。 2 3 // 定義f[i]為還剩i顆石頭時的勝負情況 &#xff0c;若S勝利&#xff0c;則記 1 &#xff0c;4 #include&…

java中定義一個CloneUtil 工具類

其實所有的java對象都可以具備克隆能力&#xff0c;只是因為在基礎類Object中被設定成了一個保留方法&#xff08;protected),要想真正擁有克隆的能力&#xff0c; 就需要實現Cloneable接口&#xff0c;重寫clone方法。通過克隆方法得到的對象是一個本地的副本。 1、實現Clonea…

C++異常以及錯誤處理

計算機應用程序中離不開錯誤處理&#xff0c;尤其是生產型大型軟件系統。應用軟件系統運行屬于循環處理事務&#xff0c;出錯后需要保證不能讓軟件程序直接退出。這就需要使用一定的程序容錯處理來應對。一般情況下&#xff0c;大型軟件開發中的軟件系統容錯處理會結合異常處理…

家用臺式計算機的額定功率,臺式機的功率(臺式電腦電源功率多大才合適?)...

臺式機的功率(臺式電腦電源功率多大才合適&#xff1f;)組裝一臺電腦&#xff0c;我們需要先挑選好硬件&#xff0c;搭配硬件最關鍵點就是CPU和主板兼容性&#xff0c;硬件之間的均衡性、電源功率等&#xff0c;均需要考慮周到。那么臺式電腦電源功率多大才合適&#xff1f;下面…

關于angularjs input上傳圖片前獲取圖片的Size 淺析

首先我們需要一個指令來追蹤input的change。ngChage不適用input[file]。 app.directive("fileread", [function () { return { scope: { selectedFile: "", changed: & }, link: function(scope, element, attributes) { element.bind("change&qu…

CountDownLacth詳解

一個同步輔助類&#xff0c;在完成一組正在其他線程中執行的操作之前&#xff0c;它允許一個或多個線程一直等待。 用給定的計數 初始化 CounDownLatch。由于調用了countDown() 方法&#xff0c;所以在當前計數到達零之前,await()方法會一直受阻塞。之后&#xff0c;會釋放所有…

怎么用計算機畫正弦函數圖像,幾何畫板如何繪制正弦函數圖象

考慮到三角函數問題描點的實際困難&#xff0c;教材表述時借助正弦線利用幾何法利用三角函數線作正弦函數圖象&#xff0c;但由此帶來的困難是如何實現這種效果。如果能讓三角函數線動起來&#xff0c;那將會更加直觀易懂。幾何畫板作為使用專業的幾何繪圖軟件&#xff0c;自帶…

C/C++常見指針錯誤 and 內存訪問越界

1) 內存分配未成功&#xff0c;卻使用了它。 編程新手常犯這種錯誤&#xff0c;因為他們沒有意識到內存分配會不成功。常用解決辦法是&#xff0c;在使用內存之前檢查指針是否為NULL。如果指針p是函數的參數&#xff0c;那么在函數的入口處用assert(p!NULL)進行檢查。如果是用m…

C#將dll打包到程序中

直接進入主題 先來看一個栗子,假設現在有一個第三方dll namespace TestLibrary1 {public class Test{public void Point(){Console.WriteLine("aaabbbccc");}} } TestLibrary1.dll在項目中引用,然后調用其中的方法Test,將輸出aaabbbccc using System;namespace Conso…

Exchange 2016集成ADRMS系列-12:域內outlook 2010客戶端測試

接下來&#xff0c;我們來到域內安裝了office 2010的機器上進行測試。 首先我們在客戶端上強制刷新組策略&#xff0c;把我們剛才設置的策略刷新下來。 然后我們可以運行gpresult /h result.html來看看策略是不是已經下來了。 策略下來之后&#xff0c;我們打開客戶端上面的out…

如何用css和HTML結合畫熊,結合偽元素實現的純CSS3高級圖形繪制

自小編上次整理了一些基礎圖形的繪制方法之后&#xff0c;大家都紛紛表示對css3的繪圖技巧學習很有幫助。雖說萬變不離其宗&#xff0c;再復雜的圖形也可以用最簡單的三角形或者圓弧組合出來&#xff0c;但仍有不少朋友反映&#xff0c;學會基本圖形也不懂得怎樣組合&#xff0…

基于C++中常見內存錯誤的總結

在系統開發過程中出現的bug相對而言是比較好解決的&#xff0c;花費在這個上面的調試代價不是很大&#xff0c;但是在系統集成后的bug往往是難以定位的bug&#xff08;最好方式是打樁&#xff0c;通過打樁可以初步鎖定出錯的位置&#xff0c;如&#xff1a;進入函數前打印日志&…

UWP開發細節記錄:判斷文件類型

StorageFile.ContentType 屬性&#xff0c;是 string 類型&#xff0c;用來表示文件內容的 MIME 類型。例如&#xff0c;音樂文件可能有 "audio/mpeg" MIME 類型。(MSDN) MIME 類型的定義可以下面的鏈接找到&#xff1a; MIME Types - http://blogs.msdn.com/b/jaime…

Creating Apps With Material Design —— Creating Lists and Cards

轉載請注明 http://blog.csdn.net/eclipsexys 翻譯自Developer Android。時間倉促&#xff0c;有翻譯問題請留言指出&#xff0c;謝謝創建Lisst和Cards在你的應用程序創建復雜的清單&#xff0c;并與材料設計風格卡。您能夠使用RecyclerView和CardView部件。 創建RecyclerView …

計算機考研自命題院校雙非,計算機考研408——951211院校匯總

眾所周知&#xff0c;計算機考研408計算機學科基礎綜合難度與一些頂尖985自命題相比也是不落下風的&#xff0c;號稱最難工科專業課(請忽略912這種殿堂級別的)&#xff0c;難度大、知識點龐雜也是前些年眾多高校紛紛脫離408統考的原因。19年的計算機類考研火到爆炸&#xff0c;…

Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

第一次鼓搗Docker&#xff0c;- - ! 報錯&#xff1a; serverubuntu1987:~$ sudo apt-get update E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) E: Unable to lock directory /var/lib/apt/lists/ 轉載于:https://www.cnblo…

新手學Struts(一)----JSP+Servlet講解MVC實現原理

MVC基本原理一個簡單的例子改良的例子Struts基本流程的實現最近在學SSH&#xff08;Struts HibernateSpring)&#xff0c;這也算是一個比較經典的框架了&#xff0c;之前都是看人家大牛說這個框架&#xff0c;那個框架&#xff0c;說的真溜&#xff0c;自己也是佩服的五體投地啊…

中國首臺千萬億次超級計算機,中國首臺千萬億次超級計算機首批設備開始試用...

新華社天津&#xff11;月&#xff11;&#xff13;日電(記者 周潤健 羅捷)記者&#xff11;&#xff13;日從國家超級計算天津中心獲悉&#xff0c;中國首臺千萬億次超級計算機“天河一號”首批設備調試工作結束&#xff0c;具備向客戶提供服務的條件&#xff0c;“天河一號”…

Outlook Express 錯誤代碼表

錯誤碼 意義 一般 0x800C01310x800C013E 可能是 Folders.dbx 檔案屬性錯誤或損壞. 0x800CCC00 身份驗證&#xff08;Authentication&#xff09;未載入 0x800CCC01 認證&#xff08;Certificate&#xff09;內容錯誤 0x800CCC02 認證日期錯誤 0x800CCC03 使用者已聯機 0x800CCC…