C++ DAY08 異常

概念

異常事件(如:除 0 溢出,數組下標越界,所要讀取的文件不存在 , 空指針,內存不足
等等)
C 語言對錯誤的處理是兩種方法:
????????一是使用整型的返回值標識錯誤;
????????二是使用 errno 宏(可以簡單的理解為一個全局整型變量)去記錄錯誤。
C++ 異常不可忽略 ( 如果忽略,進程結束 )
異常作為一個類,可以擁有自己的成員,這些成員就可以傳遞足夠的信息。
拋出異常 ----> 捕獲異常。
示例:
int main(int argc, char *argv[])
{int num = 10 / 0;cout << "OVER" << endl;return 0;
}
//不會顯示OVER,程序異常結束

拋出異常

語法:throw 值或變量;

例如:

????????throw 0;
????????throw 1.1;
????????throw 'a';
????????throw "abc";

捕獲異常

語法:

try{
????????可能會產生異常的代碼
????????111
????????222 出現異常
????????333
}
catch( 數據類型 1 變量名 )
{
????????當throw 的值與數據類型 1 相同進入此處
}
catch( 數據類型 2 變量名 )
{
????????當throw 的值與數據類型 2 相同進入此處
}
...
catch(...)
{
????????當throw 的值以上數據類型都不相同進入此處
}

示例

#include <iostream>
#include <cstring>
using namespace std;
//異常步驟,拋出異常,捕獲異常
int mydiv(int a,int b)
{if(b == 0){// 拋出異常int num = 0;throw num;}return a / b;
}
void test01(){try{mydiv(10,0);}catch(int e){cout << e << endl;}catch(char const* s){cout << s << endl;}catch(...){cout << "其他異常" << endl;}
}
int main(int argc, char *argv[])
{test01();return 0;
}

棧解旋

概念

????????異常被拋出后,從進入 try 塊起 , 到異常被拋擲前 , 這期間在棧上構造的所有對象 , 都會
被自動析構。析構的順序與構造的順序相反 , 這一過程稱為棧的解旋

示例

class A{
private:
int num;
public:
A(int num):num(num)
{cout << "構造函數" << num << endl;
}
~A()
{cout << "析構函數" << num << endl;
}
};
void test02()
{A a1(1);A a2(2);throw 0;
}
int main(int argc, char *argv[])
{try{test02();}catch(...){}return 0;
}

結果

???????? 構造函數1
? ? ? ? 構造函數2
???????? 析構函數2
???????? 析構函數1

異常的接口聲明

作用

????????限定異常拋出的類型種類

語法

????????返回值類型 函數名( 形參列表 )throw( 數據類型 1, 數據類型 2,...)
????????{
????????????????函數體
????????}
????????注意:
????????????????聲明異常后,當前函數中只能拋出指定類型的異常
????????????????throw():不允許拋出任何異常

示例

void fun01()throw(int,char)
{// throw 10;//可以// throw 'a';//可以// throw 3.14f;//不可以
}
void test03(){try{fun01();}catch(int){cout << "int的異常" << endl;}catch(char){cout << "char的異常" << endl;}catch(float){cout << "float的異常" << endl;}
}
int main(int argc, char *argv[])
{test03();return 0;
}

異常對象的生命周期

示例1:拋出異常對象

#include <iostream>
#include <cstring>
using namespace std;
class B{
private:int num;
public:B(int num):num(num){cout << "構造函數" << num << endl;}B(const B& b){this->num = b.num;cout << "拷貝構造" << num << endl;}~B(){cout << "析構函數" << num << endl;}
};
void fun02()
{throw B(10);
}
void test04()
{try{fun02();}catch(B b){}
}
int main(int argc, char *argv[])
{test04();cout << "OVER" << endl;return 0;
}

結果

示例2:拋出異常對象指針

#include <iostream>
#include <cstring>
using namespace std;
class B{
private:int num;
public:B(int num):num(num){cout << "構造函數" << num << endl;}B(const B& b){this->num = b.num;cout << "拷貝構造" << num << endl;}~B(){cout << "析構函數" << num << endl;}
};
void fun02()
{throw new B(10);
}
void test04()
{try{fun02();}catch(B *b){}
}
int main(int argc, char *argv[])
{test04();cout << "OVER" << endl;return 0;
}

結果:

示例3:拋出異常對象引用

#include <iostream>
#include <cstring>
using namespace std;
class B{
private:int num;
public:B(int num):num(num){cout << "構造函數" << num << endl;}B(const B& b){this->num = b.num;cout << "拷貝構造" << num << endl;}~B(){cout << "析構函數" << num << endl;}
};
void fun02()
{throw B(10);
}
void test04()
{try{fun02();}catch(B &b){}
}
int main(int argc, char *argv[])
{test04();cout << "OVER" << endl;return 0;
}

結果:

異常的多態

概念 :?? 子類異常對象可以被父類異常類型捕獲
示例1:
class BaseException{};
class MyException01:public BaseException{};
class MyException02:public BaseException{};
void test05()
{try{throw MyException01();}catch(BaseException){cout << "可以捕獲子類異常" << endl;}
}
int main(int argc, char *argv[])
{test05();return 0;
}
示例 2: 子類異常重寫父類虛函數
class BaseException{
public:virtual void printMsg(){}
};
class NullException:public BaseException{
public:virtual void printMsg(){cout << "空指針異常" << endl;}
};
class ArrOutException:public BaseException{
public:virtual void printMsg(){cout << "數組下標越界異常" << endl;}
};
void test05()
{try{throw NullException();}catch(BaseException &e){e.printMsg();}
}
int main(int argc, char *argv[])
{test05();return 0;
}

標準異常庫

簡介

標準庫中也提供了很多的異常類,它們是通過類繼承組織起來的。異常類繼承層級 . 結構圖
所示

標準異常使用

void test06()
{try{throw bad_alloc();}catch(exception &e){cout << e.what() << endl;}
}
int main(int argc, char *argv[])
{test06();return 0;
}

自定義異常

步驟

????????1,定義一個類
????????2,繼承與異常類
????????3,重寫 wait 方法

示例

class my_exception:public exception
{
private:char* msg;
public:my_exception(){}my_exception(char* msg){this->msg = msg;}const char *what()const noexcept{return msg;}
};
void test07()
{try{throw my_exception("自定義異常");}catch(exception &e){cout << e.what() << endl;}
}
int main(int argc, char *argv[])
{test07();return 0;
}

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

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

相關文章

自動解決IP沖突的問題 利用批處理更改末位IP循環+1直到網絡暢通為止 解放雙手 事半功倍

好久沒出來寫點什么了&#xff0c;難道今天有點時間&#xff0c;順便把這兩天碰到的問題出個解決方法吧。 這幾天去客戶那兒解決網絡問題&#xff0c;因為客戶的網絡是固定的靜態IP&#xff0c;因為沒做MAC綁定&#xff0c;IP固定在本地電腦上&#xff0c;只要上不了網&#xf…

PDF轉Word,1行Python代碼就夠了,免費用

大家好&#xff0c;這里是程序員晚楓。 今年十一假期沒出去旅游&#xff0c;在家里更新一套原創課程&#xff0c;&#x1f449;給小白的《50講Python自動化辦公》。 所有功能&#xff0c;都只需要1行代碼&#xff0c;非常適合非程序員入門Python使用。 目前全網播放量直逼100…

RK3588平臺開發系列講解(嵌入式AI篇)RKNPU詳解

文章目錄 一、CPU、GPU、FPGA和NPU介紹二、CPU、GPU、FPGA和NPU區別三、NPU 應用四、RKNPU沉淀、分享、成長,讓自己和他人都能有所收獲!?? ?? 本篇將給大家介紹什么是RKNPU。 一、CPU、GPU、FPGA和NPU介紹 二、CPU、GPU、FPGA和NPU區別 若考慮成本、功耗、計算能力以及體…

探秘開發app與小程序:一場技術與創新的博弈

app與小程序&#xff1a;一場技術與創新的博弈隨著科技的飛速發展&#xff0c;移動應用程序已經成為我們日常生活中不可或缺的一部分。在這個充滿競爭的時代&#xff0c;企業紛紛投身于開發各類移動應用&#xff0c;以期在市場中占據一席之地。然而&#xff0c;面對多樣化的應用…

PC訪問華為昇騰開發板的摸索過程

作者&#xff1a;朱金燦 來源&#xff1a;clever101的專欄 為什么大多數人學不會人工智能編程&#xff1f;>>> 最近要折騰華為昇騰開發板&#xff08;官方名稱叫&#xff1a;Atlas 200I DK&#xff09;。先是按照官方教程折騰&#xff1a;Atlas200DK環境部署。我發現…

Spark---轉換算子、行動算子、持久化算子

一、轉換算子和行動算子 1、Transformations轉換算子 1&#xff09;、概念 Transformations類算子是一類算子&#xff08;函數&#xff09;叫做轉換算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延遲執行&#xff0c;也叫懶加載執行。 2)、Transf…

Jina AI 的 8K 向量模型上線 AWS Marketplace,支持本地部署!

在當前多模態 AI 和大模型技術風頭正勁的背景下&#xff0c;Jina AI 始終領跑于創新前沿&#xff0c;技術領先。2023 年 10 月 30 日&#xff0c;Jina AI 隆重推出 jina-embeddings-v2&#xff0c;這是全球首款支持 8192 輸入長度的開源向量大模型&#xff0c;其性能媲美 OpenA…

匯編-PROC定義子過程(函數)

過程定義 過程用PROC和ENDP偽指令來聲明&#xff0c; 并且必須為其分配一個名字(有效的標識符) 。目前為止&#xff0c; 我們所有編寫的程序都包含了一個main過程&#xff0c; 例如&#xff1a; 當要創建的過程不是程序的啟動過程時&#xff0c; 就用RET指令來結束它。RET強制…

Bean依賴注入注解開發

value Value("xfy")private String userName;private String userName;Value("xiao")public void setUserName(String userName) {this.userName userName;} Autowired // 根據類型進行注入 如果同一類型的Bean有多個&#xff0c;嘗試根基名字進行二次…

AIGC,ChatGPT AI繪畫 Midjourney 注冊流程詳細步驟

AI 繪畫,Midjourney完成高清圖片繪制,輕松掌握AI工具。 前期準備: ① 一個能使用的谷歌賬號 ② 可以訪問外網 Midjourney注冊 1.進入midjourney官網https://www.midjourney.com 點擊左下角”Join the Beta”,就可以注冊,第一次使用的小伙伴會彈出提示,只需要點擊Acc…

2019年12月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 怎樣修改圖章的顏色? A:只需要一個數字來設置顏色 B:設置RGB的值 C:在畫筆中設置顏色、飽和度、亮度 D:在外觀中設置或修改角色顏色特效 答案:D 在外觀中設置或修改角色顏色特…

【深度學習】臉部修復,CodeFormer,論文,實戰

代碼&#xff1a; https://github.com/sczhou/CodeFormer 論文&#xff1a;https://arxiv.org/abs/2206.11253 Towards Robust Blind Face Restoration with Codebook Lookup Transformer 文章目錄 論文摘要1 引言2 相關工作**4 實驗****4.1 數據集****4.2 實驗設置和指標***…

【ArrayList是如何擴容(ArrayList、LinkedList、與Vector的區別)】

ArrayList、LinkedList、與Vector的區別 解讀ArrayList 是一個可改變大小的數組LinkedList 是一個雙向鏈表Vector 屬強同步類 拓展知識面ArrayList是如何擴容&#xff1f;如何利用List實現LRU&#xff1f; 解讀 List主要有ArrayList、LinkedList與Vector幾種實現。這三者都實現…

[論文筆記] Scaling Laws for Neural Language Models

概覽: 一、總結 計算量、數據集大小、模型參數量大小的冪律 與 訓練損失呈現 線性關系。 三個參數同時放大時,如何得到最佳的性能? 更大的模型 需要 更少的樣本 就能達到相同的效果。 </

開源WIFI繼電器之源代碼

源代碼:WiFiRelay: 基于ESP8285的WiFi繼電器代碼

筆記本外接顯示器的一些基本操作

1>&#xff0c;安裝問題直接問客服&#xff0c;正常情況是將顯示屏接上電源&#xff0c;然后用先將顯示屏和筆記本的HDMI接口連接即可。 按下組合鍵 win p ,選擇 “復制”。 2>&#xff0c;接上顯示屏后&#xff0c;原筆記本無聲音&#xff1f; 1、找到筆記本電腦右下…

Doris 建表示例(七)

建表語法 使用 CREATE TABLE 命令建立一個表(Table)。更多詳細參數可以查看&#xff1a; HELP CREATE TABLE; 建表語法&#xff1a; CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name(column_definition1[, column_definition2, ...][, index_definition1[, i…

阿里云99元服務器ECS經濟型e實例性能如何?測評來了

阿里云服務器優惠99元一年&#xff0c;配置為云服務器ECS經濟型e實例&#xff0c;2核2G配置、3M固定帶寬和40G ESSD Entry系統盤&#xff0c;CPU采用Intel Xeon Platinum架構處理器&#xff0c;2.5 GHz主頻&#xff0c;3M帶寬下載速度384KB/秒&#xff0c;上傳速度1028KB/秒&am…

人工智能對我們的生活影響

目錄 前言 一、人工智能的領域 二、人工智能的應用 三、對人工智能的看法 總結 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高興與大家相識&#xff0c;希望我的博客能對你有所幫助。 &#x1f4a1;本文由Filotimo__??原創&#xff0c;首發于CSDN&#x1f4…

運算與表達式模板(第一節)

目錄 前言 一、表達式模板簡介 為什么引入表達式模板&#xff1f; 緩式求值&#xff08;Memoization&#xff09; 關系 好處 前言 一個深度學習框架的初步實現為例&#xff0c;討論如何在一個相對較大的項目中深入應用元編程&#xff0c;為系統優化提供更多的可能。 以…