c++ primer plus 第15章友,異常和其他,15.3.8exception 類

c++ primer plus 第15章友,異常和其他,15.3.8exception 類

15.3.8exception 類

文章目錄

  • c++ primer plus 第15章友,異常和其他,15.3.8exception 類
  • 15.3.8exception 類
    • 1.stdexcept異常類
    • 3.空指針和 new


15.3.8exception 類

C++異常的主要目的是為設計容錯程序提供語言級支持,即異常使得在程序設計中包含錯誤處理功能更容易,以免事后采取一些嚴格的錯誤處理方式。異常的靈活性和相對方便性激勵著程序員在條件允許的情況下在程序設計中加入錯誤處理功能。總之,異常是這樣一種特性:類似于類,可以改變您的編程方式。
較新的 C++編譯器將異常合并到語言中。例如,為支持該語言,exception頭文件(以前為exception.h或except.h)定義了 exception 類,C++可以把它用作其他異常類的基類。代碼可以引發exception 異常,也可以將 exception 類用作基類。有一個名為 what()的虛擬成員函數,它返回一個字符串,該字符串的特征隨實現而異。然而,由于這是一個虛方法,因此可以在從exception派生而來的類中重新定義它:

#include <exception>
class bad_hmean :public std::exception
{
public:const char *what()return "bad arguments to hmean()";
};
class bad_gmean :public std::exception
{
public :
const char*what(){return "bad arguments to gmean()";
};

如果不想以不同的方式處理這些派生而來的異常,可以在同一個基類處理程序中捕獲它們:

try
{
...
}
catch(std::exception &e)
{cout <<e.what()<<endl;
}

否則,可以分別捕獲它們。
C++庫定義了很多基于exception 的異常類型:

1.stdexcept異常類

頭文件 stdexcept 定義了其他幾個異常類。首先,該文件定義了logic error 和 runtime error 類,它們都是以公有方式從exception 派生而來的:

class logic error:public exception{
public :
explicit logic error(const string& what arg);
...
};
class domain_error :public logic errorpublic :
explicit domain error(const string& what arg);
};

注意,這些類的構造函數接受一個string對象作為參數,該參數提供了方法 what()以 C-風格字符串方式返回的字符數據。
這兩個新類被用作兩個派生類系列的基類。異常類系列 logic_error 描述了典型的邏輯錯誤。總體而言,通過合理的編程可以避免這種錯誤,但實際上這些錯誤還是可能發生的。每個類的名稱指出了它用于報告的錯誤類型:

  • domain error;
  • invalid arqument;
  • length error;
  • out of bounds.

每個類獨有一個類似于 logic error 的構造函數,讓您能夠提供一個供方法 what()返回的字符串。數學函數有定義域(domain)和值域(range)。定義域由參數的可能取值組成,值域由函數可能的返回值組成。例如,正弦函數的定義域為負無窮大到正無窮大,因為任何實數都有正弦值:但正弦函數的值域為-1到+1,因為它們分別是最大和最小正弦值。另一方面,反正弦函數的定義域為-1到+1,值域為-到+"。如果您編寫一個函數,該函數將一個參數傳遞給函數 std:sin(),則可以讓該函數在參數不在定義域
-1到+1之間時引發 domain error 異常。異常 invalid argument指出給函數傳遞了一個意料外的值。例如,如果函數希望接受一個這樣的字符串其中每個字符要么是’0’要么是’1’,則當傳遞的字符串中包含其他字符時,該函數將引發imnvalid_argument 異常。異常 length_error 用于指出沒有足夠的空間來執行所需的操作。例如,string類的append()方法在合并得到的字符串長度超過最大允許長度時,將引發1engtherror異常。
異常 out of bounds 通常用于指示索引錯誤。例如,您可以定義一個類似于數組的類,其 operator()[]在使用的索引無效時引發out of bounds 異常。
接下來,runtime_error 異常系列描述了可能在運行期間發生但難以預計和防范的錯誤。每個類的名稱指出了它用于報告的錯誤類型:

  • range error;
  • overflow error;
  • underflow error.
    每個類獨有一個類似于 runtime_error 的構造函數,讓您能夠提供一個供方法 what( )返回的字符串。下溢(underfow)錯誤在浮點數計算中。一般而言,存在浮點類型可以表示的最小非零值,計算結果比這個值還小時將導致下溢錯誤。整型和浮點型都可能發生上溢錯誤,當計算結果超過了某種類型能夠表示的最大數量級時,將發生上溢錯誤。計算結果可能不再函數允許的范圍之內,但沒有發生上溢或下溢錯
    誤,在這種情況下,可以使用range_error 異常。一般而言,logic_error 系列異常表明存在可以通過編程修復的問題,而runtimeerror 系列異常表明存在無法避免的問題。所有這些錯誤類有相同的常規特征,它們之間的主要區別在于:不同的類名讓您能夠分別處理每種異常。另一方面,繼承關系讓您能夠一起處理它們(如果您愿意的話)。例如,下面的代碼首先單獨捕獲 out_ofbounds 異常,然后統一捕獲其他logic_error 系列異常,最后統一捕獲 exception 異常、runtime error系列異常以及其他從exception派生而來的異常:
try {
...
}
catch(out of bounds &oe)// catch out of bounds error
{...}
catch(logic error &oe)
//catch remaining logic error family
{...}
catch(exception &oe)
//catch runtime error,exception objects
{...}

如果上述庫類不能滿足您的需求,應該從logic_error或runtime_error 派生一個異常類,以確保您異常類可歸入同一個繼承層次結構中。
2.bad alloc 異常和 new
對于使用 new 導致的內存分配問題,C++的最新處理方式是讓new引發bad_alloc異常。頭文件 new包含 bad alloc 類的聲明,它是從 exception 類公有派生而來的。但在以前,當無法分配請求的內存量時,new 返回一個空指針。
程序清單 15.13演示了最新的方法。捕獲到異常后,程序將顯示繼承的 what()方法返回的消息(該消息隨實現而異),然后終止。
程序清單 15.13newexcp.cpp

// newexcp.cpp -- the bad_alloc exception
#include <iostream>
#include <new>
#include <cstdlib>  // for exit(), EXIT_FAILURE
using namespace std;struct Big
{double stuff[20000];
};int main()
{Big * pb;try {cout << "Trying to get a big block of memory:\n";pb = new Big[10000]; // 1,600,000,000 bytescout << "Got past the new request:\n";}catch (bad_alloc & ba){cout << "Caught the exception!\n";cout << ba.what() << endl;exit(EXIT_FAILURE);}cout << "Memory successfully allocated\n";pb[0].stuff[0] = 4;cout << pb[0].stuff[0] << endl;delete [] pb;// cin.get();return 0; 
}

下面該程序在某個系統中的輸出:
Trying to get a big block of memory:Caught the exception!std::bad alloc
在這里,方法what( )返回字符串“std::bad_alloc”
如果程序在您的系統上運行時沒有出現內存分配問題,可嘗試提高請求分配的內存量。

3.空指針和 new

很多代碼都是在 new 在失敗時返回空指針時編寫的。為處理 new的變化,有些編譯器提供了一個標記(開關),讓用戶選擇所需的行為。當前,C++標準提供了一種在失敗時返回空指針的new,其用法如下:

int *pi =new(std::nothrow)int;
int *pa = new(std::nowthrow)int[500];

使用這種new,可將程序清單15.13的核心代碼改為如下所示:

Big *pb;
pb =new(std::nothrow)Big[10000];//1,600,000,000 bytesif(pb ==0)
cout <<"Could not allocate memory.Bye.n";
exit(EXIT FAILURE);

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

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

相關文章

NVIDIA良心給顯卡免費升級,只為挨更多的罵

起猛了&#xff0c;還真的以為 NVIDIA 良心發現了。 眾所周知&#xff0c;英偉達對于咱們普通游戲玩家向來不屑一顧。只因為游戲業務在 NVIDIA 收入中占比較少。 在最新的 40 系顯卡 RTX 4070 Ti Super 顯卡中&#xff0c;NVIDIA悄悄給它來了一次核心「升級」&#xff0c;將原…

ARM學習(29)NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇

ARM學習&#xff08;28&#xff09;NXP 雙coreMCU IMX1160學習----NorFlash 啟動引腳選擇 1、多種啟動方式介紹 IMX1166 支持多組flexSPI 引腳啟動&#xff0c;FlexSPI1以及FlexSPI2&#xff0c;通過boot cfg可以切換FlexSPI得實例。 每個實例又支持多組引腳&#xff0c;總共…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

Subclass-balancing Contrastive Learning for Long-tailed Recognition 核心公式解析溫度參數 τ \tau τ的作用公式5解析 核心公式解析 L S B C L ? ∑ i 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log ? exp ? ( z i ? z p ? / τ 1 ) ∑ z a ∈ V ~ i exp ? ( z i ? z…

LiteOS增加執行自定義源碼

開發過程注意事項&#xff1a; 源碼工程路徑不能太長 源碼工程路徑不能有中文 一定要關閉360等殺毒軟件&#xff0c;否則編譯的打包階段會出錯 增加自定義源碼的步驟: 1.創建源碼目錄 2. 創建源文件 新建myhello目錄后&#xff0c;再此目錄下再新建源文件myhello_demo.c 3. 編…

程序員學長 | PyCaret,一個超強的 python 庫

本文來源公眾號“程序員學長”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;PyCaret&#xff0c;一個超強的 python 庫 今天給大家分享一個超強的 python 庫&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 簡介 …

[論文筆記]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天帶來又一篇RAG論文筆記&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 檢索增強語言模型能夠更好地適應世界狀態的變化并融入長尾知識。然而&#xff0c;大多數現有方法只能從檢索語料庫中檢索到短的連續文本片段&#xff0…

random.choices 的參數及其應用

random.choices 是 Python 的 random 模塊中的一個函數&#xff0c;用于從給定的序列中隨機選擇元素&#xff0c;可以設置權重。這個函數在需要根據特定概率分布進行隨機選擇的場景中非常有用。下面是 random.choices 的參數及其詳細介紹&#xff1a; 文章目錄 參數應用示例基本…

釋放序列和同步

#include <iostream> #include<thread> #include<atomic> #include<vector> std::atomic<int>count(0); std::vector<int>queue_data; //如果存儲操作被標記為memory_order_release、memory_order_acq_rel或memory_order_seq_cst&#xff…

FP5207+音頻功率放大器的組合解決方案-適用于便攜式音頻播放器、無線耳機、智能音箱和車載音響系統等高質量音頻輸出需求的產品,以提高電池供電的效率和輸出功率

隨著消費者對智能家居的需求增長&#xff0c;智能音響市場成為重要增長點。同時&#xff0c;音響技術也在不斷發展&#xff0c;音響及揚聲器的功能和性能不斷提升。 藍牙音箱&#xff0c;這類音箱供電是以鋰電池為主&#xff0c;一般選用內置升壓的音頻功放芯片&#xff0c;音響…

iOS input 標簽 focus 失效

解決方案 <inputv-if"show"ref"inputRef" />watch(inputRef, (ref) > {ref?.focus(); });

vivado DQS_BIAS

DQS_偏差 DQS_BIAS是驅動差分輸入緩沖器的頂級端口的屬性&#xff0c;或者 雙向緩沖基元&#xff08;IBUFDS、IOBUFDS&#xff09;。 DQS_BIAS屬性在某些的輸入端提供可選的DC偏置 偽差分I/O標準&#xff08;DIFF_SSTL&#xff09;和真差分I/O規范&#xff08;LVDS&#xff09;…

windows 構建nginx本地服務隨系統自啟

1.先去官網下載一個nginxzip 2.將zip解壓&#xff0c;將nginx-server.exe文件放入文件夾 3.創建nginx-server.xml&#xff0c;將以下內容放進文件內 <service> <id>nginx</id> <name>Nginx Service</name> <description>High Per…

強化學習中的蒙特卡洛算法和時序差分算法

在強化學習&#xff08;Reinforcement Learning, RL&#xff09;中&#xff0c;價值函數的估計是核心任務之一。蒙特卡洛&#xff08;Monte Carlo, MC&#xff09;方法和時序差分&#xff08;Temporal Difference, TD&#xff09;方法是兩種常用的策略&#xff0c;用于估計狀態…

軟件架構之架構風格

軟件架構之架構風格 9.3 軟件架構風格9.3.1 軟件架構風格分類9.3.2 數據流風格9.3.3 調用/返回風格9.3.4 獨立構件風格9.3.5 虛擬機風格9.3.6 倉庫風格 9.4 層次系統架構風格9.4.1 二層及三層 C/S 架構風格9.4.2 B/S 架構風格9.4.3 MVC 架構風格9.4.4 MVP 架構風格 9.5 面向服務…

機器學習筑基篇,?Ubuntu 24.04 編譯安裝 Python 及多版本切換

[ 知識是人生的燈塔&#xff0c;只有不斷學習&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 編譯安裝最新Python及多版本切換 描述&#xff1a;說到機器學習&#xff0c;人工智能&#xff0c;深度學習不免會提到Python這一門編程語言&#xff08;人生苦短&#xff0c;及時Pyt…

windows防火墻端口設置

PS&#xff1a;本文實例為Windows Server 2019&#xff0c;其他Windows版本大同小異。 1、首先打開windows防火墻&#xff0c;點擊“高級設置” 2、 高級設置界面 3、假設需要開放一個端口為3306應該怎么做 光標對準“入站規則”右鍵新建規則&#xff0c;選擇“端口” 協議這…

C++類和對象(一)

目錄 面向過程和面向對象 面向過程編程&#xff08;Procedural Programming&#xff09; 面向對象編程&#xff08;Object-Oriented Programming&#xff09; 一、類的定義 類定義格式 類域 二、類的訪問限定符及封裝 訪問限定符 封裝 三、實例化 實例化概念 對象大小…

軟件運行次數

題目&#xff1a; 實現一個驗證程序運行次數的小程序&#xff0c;要求如下&#xff1a; 當程序運行超過3次時給出提示&#xff1a;本軟件只能免費使用3次&#xff0c;歡迎您注冊會員后繼續使用&#xff5e;程序運行演示如下&#xff1a; 第一次運行控制臺輸出&#xff1a;歡迎…

常見WAF攔截頁面總結

(1) D盾 (2) 云鎖 (3) UPUPW安全防護 (4) 寶塔網站防火墻 (5) 網防G01 (6) 護衛神 (7) 網站安全狗 (8) 智創防火墻 (9) 360主機衛士或360webscan (10) 西數WTS-WAF (11) Naxsi WAF (12) 騰訊云 (13) 騰訊宙斯盾 (14) 百度云 圖片 (15) 華為云 (16) 網宿云 (17) 創宇盾 圖片 (…

ROS服務通信自定義srv

服務通信自定義srv 流程:創建ROS功能包按照固定格式創建srv文件編譯配置文件編譯生成中間文件 流程: srv 文件內的可用數據類型與 msg 文件一致&#xff0c;且定義 srv 實現流程與自定義 msg 實現流程類似&#xff0c;需查閱msg文件的可以瀏覽ROS話題通信流程自定義數據msg格式…