c++異常機制(5)-- 繼承與異常

我們在c++異常機制(3)中自定義類型,我們將相應的異常封裝成了類,在類中實現一些方法,對異常進行處理。其中每一個類都實現了print()方法。

我們使用throw拋出相應異常的虛擬對象,在catch參數中進行匹配,但是如果有很多異常類型,我們就需要寫很多的catch進行匹配,能否只寫一個catch就可以匹配不同的異常類,并且調用對應的處理函數。?

這就需要我們之前學到的多態(虛函數)了,可以直接將子類賦值給父類,而且在catch中是支持的。?(在c++異常機制(2)中說過了)

所以,我們可以將所有異常類都繼承于一個父類,并且在父類中寫一些處理異常所用的純虛函數。(因為在父類中不需要實現,而且父類不需要定義對象,在子類中根據對應子類的需求對繼承的純虛函數進行實現)。

在使用虛函數之后,我們遇到異常之后,拋出對應異常類的匿名對象,然后再catch中使用父類型來捕獲,這樣接收的那個子類,然后就能調用對應子類的處理函數。?

關于虛函數請看c++多態(2) -- 虛函數

代碼:? ?

#define BUFFER_SIZE 1024class FileError {
public:FileError(int err) :errorData(err) {};virtual void print() = 0;   // 純虛函數
protected:  // 可以讓元素在子類中直接使用int errorData;
};class OpenFileError : public FileError{
public:OpenFileError(int err) :FileError(err) {};void print() override{switch (errorData) {case -1:printf("源文件打開失敗 %d\n", errorData);break;case -2:printf("目的文件打開失敗 %d\n", errorData);break;}}
};class WriteFileError:public FileError{
public:WriteFileError(int err) :FileError(err) {}void print() override {printf("文件寫入失敗");}
};// 將一個文件中的內容拷貝到另外一個文件中去
int makeFile(const char* dest, const char* src) {// 定義文件指針FILE* fp1 = NULL, * fp2 = NULL;// 打開文件, 以只讀二進制形式打開文件,打開失敗返回NULLfp1 = fopen(src, "rb"); // 判斷文件是否成功打開if (!fp1) {throw OpenFileError(-1);}// 打開文件,以只寫二進制形式打開文件,打開失敗返回NULLfp2 = fopen(dest, "wb");// 判斷文件是否成功打開if (!fp2) {throw OpenFileError(-2);    //  返回錯誤標記,表示目標文件打開失敗}// 進行文件的拷貝char buffer[BUFFER_SIZE];    // 1024字節的緩存int readLen, writeLen;       // 每次讀取的長度和寫入的長度// 讀取的長度大于0,說明有內容可以寫入,執行循環體的寫入內容while ((readLen = fread(buffer, 1, BUFFER_SIZE, fp1)) > 0) {writeLen = fwrite(buffer, 1, readLen, fp2);// 如果一次寫入的長度和讀取的長度不等,那么說明寫入失敗if (readLen != writeLen) {throw WriteFileError(-1); }}// 關閉文件fclose(fp1);fclose(fp2);return 0;  // 一切正常返回0
}int makeFile2(const char* dest, const char* src) {int ret;ret = makeFile(dest, src);printf("makeFile2 函數被調用");return ret;
}int main(void) {int ret = 0;try {ret = makeFile2("dest.txt", "src.txt");}catch (FileError& error) {error.print();}system("pause");return 0;
}

與前面的代碼對比,catch的參數我們只需要寫一個就可以匹配所有的異常情況,在異常類型多的情況下,這顯然更加的簡便。?

?

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

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

相關文章

Springboot項目集成短信驗證碼(超簡單)

操作流程 注冊驗證碼平臺創建驗證碼模版開始集成(無需引入第三方庫) 注冊并登陸中昱維信驗證碼平臺 獲取AppID和AppKey。 創建驗證碼模版 創建驗證碼模版,獲取驗證碼模版id 開始集成 創建controller import org.springframework.web.bi…

MATLAB環境下基于隨機游走拉普拉斯算子的快速譜聚類方法

古人有云,物以類聚,在面臨信息爆炸問題的今天,對信息類別劃分的價值日益顯現,并逐步成為學者們的研究熱點。分類和聚類是數據挖掘的重要工具,是實現事物類別劃分的左右手,聚類又是分類一種特殊的方式。所謂…

CodeWhisperer安裝教導--一步到位!以及本人使用Whisperer的初體驗。

CodeWhisperer是亞馬遜出品的一款基于機器學習的通用代碼生成器,可實時提供代碼建議。類似 Cursor 和Github AWS CodeWhisperer 亞馬遜科技的CodeWhisperer是Amazon于2021年12月推出的一款代碼補全工具,與GitHub Copilot類似。主要的功能有:代碼補全注釋…

貓毛過敏養貓人士的必備養貓好物-寵物空氣凈化器品牌分享

許多貓奴在與貓相處一段時間后突然對貓毛過敏,這真是令人難受。一些人認為對貓咪過敏是因為它們在空氣中飄浮的毛發引起的,但實際上大部分人之所以過敏是因為對貓身上一種微小的蛋白質過敏。這種導致過敏的蛋白質附著在貓咪的一些皮屑上。我們都知道貓咪…

前端架構: 腳手架通用框架封裝之入口文件開發(教程一)

腳手架入口文件開發 創建腳手架項目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安裝 lerna, $ npm i -g lerna 基于 lerna 完成項目初始化 $ lerna init 基于 lerna 創建腳手架 cli $ lerna create cli一路回車 好現在生成了一個 cli 的模板,目前需要…

Qt 中Json的構造和解析簡單例子

概述: Qt中使用Json比較方便,不像純C需要導入CJson RapidJson JsonCpp等第三方的庫,主要使用到QJsonDocument、QJsonObject對象即可 1、如何構造一個json字符串 假如我們需要構造 {"cmd":"1001","data":{"content&q…

Linux 下安裝Jupyter

pip3 install jupyter pip3 install ipython -------------------------------------------- pip3 install jupyterlab jupyter lab pip3 list | grep jupyterlab 啟動: python3 -m jupyter lab 2.安裝朱皮特 pip3 install -i https://pypi.douban.com/simpl…

高性能的key-value數據庫Redis 介紹

Redis 是一個高性能的key-value數據庫。 Redis是一個開源的鍵值存儲系統,通常用于緩存和消息傳遞。它支持多種類型的數據結構,如字符串、列表、集合、散列表和有序集合等。Redis的特點是提供了高性能、靈活性和可伸縮性。 Redis的主要特點包括&#xff…

Pytorch學習 day02(加載數據)

加載數據 * Dataset提供一種方式:來獲取數據及其label,給數據進行編號 * Dataloader為神經網絡提供不同的數據形式 Dataset的組織形式有很多種,例如: 將label放在文件夾名上,如下: #Dateset # --train #…

Python算法題集_組合總和

Python算法題集_組合總和 題39:組合總和1. 示例說明2. 題目解析- 題意分解- 優化思路- 測量工具 3. 代碼展開1) 標準求解【值傳遞回溯】2) 改進版一【引用傳遞堆棧回溯】3) 改進版二【過程值列表緩存遍歷后檢索】 4. 最優算法5. 相關資源 本文為Python算法題集之一的…

.halo勒索病毒的最新威脅:如何恢復您的數據?

尊敬的讀者: 隨著科技的發展,網絡安全已經成為我們日常生活中不可忽視的重要議題。其中,勒索病毒是當前網絡安全威脅中的一大挑戰,而“.halo”勒索病毒更是近期備受關注的惡意軟件之一。本文將介紹關于“.halo”勒索病毒的背景知…

AI新工具(20240227) StickerBaker文本生成貼紙的工具;Mistral Large;Rewind等

StickerBaker - 基于Replicate和Fly.io技術,100%開源的制作貼紙的工具 StickerBaker是一個基于人工智能的貼紙創作工具,允許用戶通過輸入特定的提示語句生成獨特的貼紙。這個工具使用了Replicate平臺來生成貼紙,同時依托于Fly.io作為其基礎設…

算法項目外包的收費方式

針對算法研究性項目的收費方式和注意事項,這取決于項目的具體性質、規模和所涉及的技術領域。以下是一些常見的收費方式和需要注意的問題,希望對大家有所幫助。北京木奇移動技術有限公司,專業的軟件外包開發公司,歡迎交流合作。 收…

Python學習DAY09_文件和異常

文件和異常 實際開發中常常會遇到對數據進行持久化操作的場景,而實現數據持久化最直接簡單的方式就是將數據保存到文件中。 在 Python 中實現文件的讀寫操作其實非常簡單,通過 Python 內置的 open 函數,我們可以指定文件名、操作模式、編碼信…

1552.平衡二叉樹

輸入格式 第一行包含整數 N,表示總插入值數量。第二行包含 N 個不同的整數,表示每個插入值。 輸出格式 輸出得到的 AVL 樹的根是多少。 數據范圍 1≤N≤20 輸入樣例1: 5 88 70 61 96 120 輸出樣例1: 70 輸入樣例2&#xff1a…

商業江湖大揭秘:月入千萬與顆粒無收,究竟差了什么?

在商業的浩瀚江湖 英雄豪杰們或乘風破浪、月入千萬,或步履蹣跚、顆粒無收,這背后的奧秘究竟何在?是天意難測,還是人為疏忽?是制度的不完善,還是工具的滯后不前?答案就隱藏在你未曾注意的細節之…

公司招嵌入式開發崗位,為什么感覺一年比一年難?

最近看到一個問題: 是一個HR在吐槽招不到嵌入式開發的人才。 這句話,難免會誤導一些想入行嵌入式的同學,臥槽,這么缺人?趕緊沖! 哼次哼次學完一堆技術棧,一投簡歷,一個面試機會都沒有。 這就是…

24路電磁鎖主板在智能存儲系統中的作用

在無人值守場景中,如自助服務機、智能生鮮柜、共享儲物柜等,使用24路電磁鎖主板可以集成身份識別技術,將用戶的驗證結果轉化為相應的開鎖動作,提升用戶體驗和運營效率,是實現智能存儲系統高效、安全和自動化運行的關鍵…

Kubernetes的五大開源存儲項目

在Kubernetes中,關于數據的持久化管理是一種挑戰,對此,社區提供了多種存儲的解決方案,這些方案旨在簡化和優化容器化應用程序的持久化數據管理。 現介紹 Kubernetes 的五大開源存儲項目,帶你了解開源存儲解決方案的多…

unity后期

unity|后處理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后處理效果 抗鋸齒①、Ambient Occlusion 環境光遮蔽②、Auto Exposure 自動曝光③、Bloom 輝光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色調/顏色分級⑥、Depth Of Fiel…