一篇文章帶你入門C++的異常處理
一、背景
程序運(yùn)行時(shí)常會(huì)碰到一些異常情況,例如:
- 做除法的時(shí)候除數(shù)為 0;
- 用 new 運(yùn)算符動(dòng)態(tài)分配空間時(shí),空間不夠?qū)е聼o(wú)法分配;
- 訪問(wèn)數(shù)組元素時(shí),下標(biāo)越界;打開(kāi)文件讀取時(shí),文件不存在。
這些異常情況,如果不能發(fā)現(xiàn)并加以處理,很可能會(huì)導(dǎo)致程序崩潰。
所謂“處理”,可以是給出錯(cuò)誤提示信息,然后讓程序沿一條不會(huì)出錯(cuò)的路徑繼續(xù)執(zhí)行;也可能是不得不結(jié)束程序,但在結(jié)束前做一些必要的工作,如將內(nèi)存中的數(shù)據(jù)寫入文件、關(guān)閉打開(kāi)的文件、釋放動(dòng)態(tài)分配的內(nèi)存空間等。
二、C++ 異常處理
C++ 引入了異常處理機(jī)制。
異常提供了一種轉(zhuǎn)移程序控制權(quán)的方式。C++ 異常處理涉及到三個(gè)關(guān)鍵字:try、catch、throw。
- throw: 當(dāng)問(wèn)題出現(xiàn)時(shí),程序會(huì)拋出一個(gè)異常。這是通過(guò)使用 throw 關(guān)鍵字來(lái)完成的。
- catch: 在您想要處理問(wèn)題的地方,通過(guò)異常處理程序捕獲異常。catch 關(guān)鍵字用于捕獲異常。
- try: try 塊中的代碼標(biāo)識(shí)將被激活的特定異常。它后面通常跟著一個(gè)或多個(gè) catch 塊。
舉個(gè)例子
#include <iostream> #include <exception> using namespace std; int main () { try { throw 1; throw "error"; } catch (const char* str) { cout << str << endl; } catch (int i) { cout << i << endl; } }
運(yùn)行結(jié)果
也可以自己定義異常類來(lái)進(jìn)行處理:
#include <iostream> #include <exception> using namespace std; //可以自己定義Exception class myexception: public exception { virtual const char* what() const throw() { return "My exception happened"; } }myex; int main () { try { if(true) //如果,則拋出異常; throw myex; } catch (exception& e) { cout << e.what() << endl; } return 0; }
三、拋出異常與捕獲異常
可以使用 throw 語(yǔ)句在代碼塊中的任何地方拋出異常。throw 語(yǔ)句的操作數(shù)可以是任意的表達(dá)式,表達(dá)式的結(jié)果的類型決定了拋出的異常的類型。
以下是嘗試除以零時(shí)拋出異常的實(shí)例:
#include <iostream> using namespace std; double division(int a, int b) { if( b == 0 ) { throw "Division by zero condition!"; } return (a/b); } int main () { int x = 50; int y = 0; double z = 0; try { z = division(x, y); cout << z << endl; }catch (const char* msg) { cerr << msg << endl; } return 0; }
運(yùn)行結(jié)果
四、catch(...)的作用
catch(…)能夠捕獲多種數(shù)據(jù)類型的異常對(duì)象,所以它提供給程序員一種對(duì)異常對(duì)象更好的控制手段,使開(kāi)發(fā)的軟件系統(tǒng)有很好的可靠性。因此一個(gè)比較有經(jīng)驗(yàn)的程序員通常會(huì)這樣組織編寫它的代碼模塊,如下:
void Func() { try { // 這里的程序代碼完成真正復(fù)雜的計(jì)算工作,這些代碼在執(zhí)行過(guò)程中 // 有可能拋出DataType1、DataType2和DataType3類型的異常對(duì)象。 } catch(DataType1& d1) { } catch(DataType2& d2) { } catch(DataType3& d3) { } catch(…) { } }
例子
double division(int a, int b) { if (b == 0) { throw "Division by zero condition!"; } return (a / b); } int main() { try { int res = division(10,0); } catch (...) { cout << " * ********" << endl; } return 0; }
參考:
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng))
這篇文章主要介紹了VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng)),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02解決C++ 無(wú)法從void 轉(zhuǎn)換為L(zhǎng)RESULT的方法詳解
本篇文章是對(duì)C++中無(wú)法從void轉(zhuǎn)換為L(zhǎng)RESULT的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體詳解
下面小編就為大家?guī)?lái)一篇全面了解C語(yǔ)言結(jié)構(gòu)體,枚舉,聯(lián)合體。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09C語(yǔ)言中strspn()函數(shù)和strcspn()函數(shù)的對(duì)比使用
這篇文章主要介紹了C語(yǔ)言中strspn()函數(shù)和strcspn()函數(shù)的對(duì)比使用,strspn是計(jì)算屬于字符串的字符數(shù)而strcspn則是判斷不屬于,需要的朋友可以參考下2015-08-08淺談C++中的mutable和volatile關(guān)鍵字
下面小編就為大家?guī)?lái)一篇淺談C++中的mutable和volatile關(guān)鍵字。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-06-06C語(yǔ)言線性代數(shù)算法實(shí)現(xiàn)矩陣示例代碼
這篇文章主要為大家介紹了使用C語(yǔ)言線性代數(shù)的算法來(lái)實(shí)現(xiàn)矩陣示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(41.首個(gè)缺失的正數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++使用文件實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++使用文件實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01