【C++基礎】異常匹配與內建異常類

目錄

  • 異常匹配
    • catch: 按異常類型匹配
    • 為何要使用異常類
  • 內建異常類
    • 標準庫中的異常基類
    • 標準庫中的異常類
    • 例1:vector下標訪問越界out_of_range異常
    • 例2:內存分配失敗bad_alloc異常
    • 例3:側向轉換失敗bad_cast異常類
    • 幾種情況,使用對應異常

異常匹配

catch: 按異常類型匹配

已知try是監視可能出現問題的代碼,throw是扔出問題,catch是看扔出的問題是否和它的類型匹配,如果是匹配那么就抓住問題進行處理。
這里的類型使用傳引用,避免拷貝浪費。

catch ( ExceptionType& parameter ) { /* 處理異常 */ }

若try{}中所拋異常類型與catch()的參數類型(ExceptionType)匹配,則進入catch塊
若對異常對象的內容不感興趣,可省略catch參數,只保留類型。
如:

catch ( ExceptionType& ) { /* 處理異常 */ }

舉例:
f1()拋出整型異常。
f2()是要申請28G內存,如果電腦內存不夠,執行代碼會出錯,拋出bad_alloc異常。這是C++規定的,new出現問題就會拋出bad_alloc異常。bad_alloc是C++異常類exception基類的派生類。

void f1() { throw 100; }
void f2() { for (int i = 1; i <= 100; i++) new int[70000000]; }

對于f1的兩種處理:

try { f1(); }
catch (int) { //僅有類型cout << "Error" << endl;
}try { f1(); }
catch (int& e) { //類型+參數cout << e << endl;
}

對于f2的兩種處理:
注意e.what()是exception類內部的一個虛函數,返回的是一個指針,指向一個字符串,包含了異常的解釋信息。


try { f2(); } 
catch (bad_alloc) {cout << "new failed" << endl;
}
try { f2(); } 
catch (bad_alloc &e) {cout << "Exception: " << e.what() << endl;
}

為何要使用異常類

整數作為異常類型,只能獲取整數的信息。
不使用異常類,則捕獲的異常所能傳遞的信息量很少。

try {// ...
}
catch (int e) {//do something with e
}

使用異常類,則可以在拋出異常時傳遞很多信息,在捕獲異常時接收這些信息。

class Beautiful {string name;string hometown;int    salary;string misdoing;
// ………… 
}
try {// ...
}
catch (Beautiful object) {//do something with object
}

內建異常類

標準庫中的異常基類

exception 是標準庫所有異常類的基類
使用異常類需要包括頭文件 #include <exception>
class exception需要注意的部分如下:

exception(); // 構造函數
virtual const char* what(); //返回解釋性字符串
what()返回的指針指向擁有解釋信息的空終止字符串的指針。該指針保證在獲取它的異常對象被銷毀前,或在調用該異常對象的非靜態成員函數前合法

標準庫中的異常類

在使用所有標準庫異常類的時候,都必須附加std名字空間。
在這里插入圖片描述
runtime_error與logic_error的使用區別
來自wiki的解釋:

邏輯錯誤:(有時稱為語義錯誤)是程序中的一個錯誤,它會導致程序錯誤運行,但不會異常終止(或崩潰)。邏輯錯誤會產生非預期或不希望的輸出或其他行為,盡管它可能不會立即被識別。
編譯語言和解釋語言都會出現邏輯錯誤。與有語法錯誤的程序不同,有邏輯錯誤的程序在語言中是有效的程序,盡管它的行為不符合預期。
運行時錯誤:一個錯誤在程序執行過程中發生的。相反,編譯時錯誤發生在程序編譯時。運行時錯誤表示程序中的錯誤或設計人員預期的問題,但卻無能為力。例如,內存不足通常會導致運行時錯誤。

例1:vector下標訪問越界out_of_range異常

vector有許多種訪問元素的方式,其中[]下標訪問不會做越界檢查,at()會做越界檢查。
在這里插入圖片描述
在這里插入圖片描述
我們將它截獲
在這里插入圖片描述

例2:內存分配失敗bad_alloc異常

#include<iostream>
using namespace std;
int main()
{for( int i = 0; i < 10000; i++){auto *p = new long long int [70000];cout << i << "array" << endl;}return 0;
}

在這里插入圖片描述
進行捕獲

#include<iostream>
#include <exception>
#include <stdexcept>
#include <new>
using namespace std;
int main()
{try {for (int i = 0; i < 10000; i++){auto* p = new long long int[70000];cout << i << "array" << endl;}}catch (bad_alloc& e){cout << "exception " << e.what() << endl;}return 0;
}

exception bad allocation程序正常退出。

例3:側向轉換失敗bad_cast異常類

創建基類student
創建派生類Undergraduate和Graduate
主函數中用dynamic_cast 將Undergraduate類型轉換為Graduate類型.
dynamic_cast只有在做引用類型轉換時候轉換失敗才會拋出異常。使用指針類型時,如果轉換失敗會返回nullptr

#include <iostream>
#include <exception>
#include <stdexcept>using namespace std;class Student {
public:Student() = default;virtual void foo() {};
};
class Undergraduate : public Student {};
class Graduate : public Student {};
int main()
{Undergraduate u;Graduate g;Student *s1 = &u;Student *s2 = &g;//正常操作,p指針不為nullptrGraduate *p = dynamic_cast<Graduate *>(s2);//轉化不成功,p2指針為nullptrGraduate *p2 = dynamic_cast<Graduate *>(s1);if(p2 == nullptr){cout << "cast s1 to Graduate* failed " << endl;}else{cout << "cast s1 to Graduate* succeeded " << endl;}//引用,拋異常try{Graduate &r1 = dynamic_cast<Graduate &> (u);}catch (bad_cast & e){cout << "Exception: " << e.what() << endl;}return 0;
}

在這里插入圖片描述

幾種情況,使用對應異常

1、除法運算中除數為0;
:invalid_argument

2、在只讀文件系統中以寫模式打開一個文件流;
:filesystem::filesystem_error
3、 數組a的容量為5,向 a[5] 中寫入數據;
:out_of_range

4、用 new 申請內存失敗;
:bad_array_new_length
5、將A指針類型轉換為B指針類型失敗;
:bad_any_cast
6、將 1234567 這個整數存到一個 short int 類型的變量中(在32位C++編譯器中編譯)
:length_error

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

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

相關文章

scala 訪問修飾符_Scala中的訪問修飾符

scala 訪問修飾符Access modifiers are used in order to restrict the usage of a member function to a class or a package. Using access modifiers data hiding takes place which is a very important concept of OOPs. 訪問修飾符用于將成員函數的使用限制為類或包。 使…

小試---EF5.0入門實例1

現在做個小練習吧~~~ 第一步&#xff1a;首先新建一個數據庫名字為Test;數據庫里面只有一個表UserTable 腳本為&#xff1a; USE [master] GO /****** 對象: Database [Test] 腳本日期: 12/15/2013 18:51:54 ******/ CREATE DATABASE [Test] ON PRIMARY ( NAME NTest, F…

iScroll4 禁止select等頁面元素默認事件的解決方法 轉

iScroll4 禁止select等頁面元素默認事件的解決方法起因在于onBeforeScrollStart : function(e){ e.preventDefault(); },這一行&#xff0c;iSroll禁止了事件的默認行為&#xff0c;導致select&#xff0c;option&#xff0c;textarea等元素無法點擊。解決方法也很簡單&#xf…

C++中比較兩個浮點數是否相等

來源&#xff1a; https://stackoverflow.com/a/37686/3242645 代碼&#xff1a; #include <cmath> #include <limits> bool AreSame(double a, double b) {return std::fabs(a - b) < std::numeric_limits<double>::epsilon(); }

MPEG的完整形式是什么?

MPEG&#xff1a;運動圖像專家組 (MPEG: Moving Picture Experts Group) MPEG is an abbreviation of Moving Picture Experts Group. It is a working group of authorities that is founded to establish standards for audio and video compression and transmission. The a…

正則 去除html標記

//string regexstr "<[^>]*>"; //去除所有的標簽 //"<script[^>]*?>.*?</script>" //去除所有腳本&#xff0c;中間部分也刪除 // string regexstr "<img[^>]*>"; //去除圖片的正則 // string regexstr &…

自畫PopMenu彈出

BorderColor:TColor; //邊框顏色FillColor:TColor; //未選中填充顏色TextColor:TColor; //未選中字體顏色SelectTextColor:TColor; //選中字體顏色SelectFillColor:TColor; //選中填充顏色SideBuffer:Integer; //邊框寬度procedure TForm1.FormCreate(Sender: TObject); b…

安利一款倒計時插件---雨滴桌面

內容來自B站(搜索Rainmeter即可)&#xff0c;里面教程很多&#xff0c;因為視頻看的有點麻煩&#xff0c;故進行了整理 一、下載安裝包、解壓、安裝 免費下載連接&#xff0c;不需要積分 skin文件夾存放皮膚的一些配置文件&#xff0c;因為原本皮膚太low了 第二個是可執行文…

【C++基礎】自定義異常類與多重捕獲

目錄自定義異常類構建過程例&#xff1a;Vec3D類的數組下標越界的異常類捕獲多種無關異常不同的異常的捕獲捕獲派生異常異常處理的次序例子&#xff1a;多重捕獲異常類catch塊的參數類型可以不用引用類型嗎?自定義異常類 自定義異常類通常由exception或其后代類派生。這樣我們…

gprs 睡眠模式_GPRS的完整形式是什么?

gprs 睡眠模式GPRS&#xff1a;通用分組無線業務 (GPRS: General Packet Radio Service) GPRS is an abbreviation of General Packet Radio Service. It is a non-voice, high-level speed packet switching technology planned for GSM networks. On 2G and 3G cellular tran…

int main(int argc,char* argv[])講解

分類&#xff1a; 學習筆記2011-11-07 21:502354人閱讀評論(0)收藏舉報dos編譯器pathunixcommandc在最近學習中老是遇到 int main(int argc,char* argv[])&#xff0c;以為就是簡單的參數應用了&#xff0c;但是看代碼是沒能理解參數的具體傳遞過程&#xff0c;上網…

Maven實戰(七)——常用Maven插件介紹(上)

我們都知道Maven本質上是一個插件框架&#xff0c;它的核心并不執行任何具體的構建任務&#xff0c;所有這些任務都交給插件來完成&#xff0c;例如編譯源代碼是由maven-compiler-plugin完成的。進一步說&#xff0c;每個任務對應了一個插件目標&#xff08;goal&#xff09;&a…

【設計模式之美】<Reading Notes>抽象類與接口

抽象類特性 1、抽象類不允許被實例化&#xff0c;只能被繼承。 2、抽象類可以包含屬性和方法。方法既可以包含代碼實現&#xff0c;也可以不包含代碼實現。不包含代碼實現的方法叫做抽象方法。 3、子類繼承抽象類&#xff0c;必須實現抽象類中的所有抽象方法。 接口特性 1、…

多線程之間共享數據的實現

1&#xff1a;如果每個線程執行的代碼相同&#xff0c;可以使用同一個Runnable對象&#xff0c;然后將共享的數據放在Runnable里面&#xff0c;來實現數據的共享。 例如買票系統... package com.cn.gbx;import java.util.Date; import java.util.Random; import java.util.Time…

AIX的完整形式是什么?

AIX&#xff1a;高級交互式主管 (AIX: Advanced Interactive Executive) AIX is an abbreviation of "Advanced Interactive Executive". AIX是“ Advanced Interactive Executive”的縮寫 。 It is a progression sequence of proprietary UNIX operating systems …

c#生成隨機字符串 用做批量申請賬號時的隨機密碼還是相當不錯的

//隨機字符串生成器的主要功能如下&#xff1a; //1、支持自定義字符串長度 //2、支持自定義是否包含數字 //3、支持自定義是否包含小寫字母 //4、支持自定義是否包含大寫字母 //5、支持自定義是否包含特殊符號 //6、支持自定義字符…

【C++基礎】C++11的noexcept聲明符 與 異常傳播

目錄C noexcept&#xff1a;1、用途2、用法1、noexcept聲明符的用法&#xff1a;2、noexcept運算符的用法異常傳播1、異常傳播的定義2、異常傳播中的規則3、異常傳播的代價C noexcept&#xff1a; 1、用途 C11使用noexcept指明函數是否拋出異常&#xff1a; 若函數不拋異常&a…

使用IndexReader.repen提高搜索速度

1,使用indexreader創建indexsearcher. 2,indexsearcher在使用完了以后不要關閉. 3.使用indexreader.isCurrent()判斷索引是否被indexwriter改動. 4,如果索引被改動,indexsearcher.close()先前那個,然后new indexsearcher(indexreader). 傳string給searcher,searcher會維護一個內…

CSS中的文本格式

CSS文字格式 (CSS text formatting) CSS text properties allow you to style your text in various ways very easily. Such as color, alignment, spacing, direction, etc. CSS文本屬性使您可以輕松地以各種方式設置文本樣式。 例如顏色 &#xff0c; 對齊方式 &#xff0c;…

【C++基礎】重拋異常與異常的使用場景

重拋異常 異常處理程序可以重新拋出異常。 當它無法處理該異常&#xff0c;或想通知它的調用者發生了一個異常&#xff0c;此時就需要重拋異常&#xff1a; 1、拋出捕獲的異常 try {// statements; } catch (TheException &ex) {// Do something;throw; }2、重新拋出另一…