C/C++中異常處理詳解及其作用介紹
概述
作為一名專業(yè)寫 Bug, 編程一天改 bug 一周的程序媛. 學會異常處理是非常重要的. 我們不僅要考慮沒有錯誤的理想情況, 更要考慮存在錯誤時的情況.
Debug 可以幫助我們盡快發(fā)現(xiàn)錯誤, 消除錯誤. 錯誤類別:
- 語法錯誤
- 運行錯誤
- 邏輯錯誤
異常處理
設(shè)計程序時, 事先分析程序運行時可能出現(xiàn)的各種意外情況, 定制出相應(yīng)的處理方法. 異常處理指對運行時出現(xiàn)的差錯以及其他例外情況的處理.
沒有異常處理程序時, 運行出現(xiàn)異常, 程序只能終止運行. 設(shè)置了異常處理機制, 運行出現(xiàn)異常, 程序的流程就轉(zhuǎn)到異常處理代碼段處理. 用戶可以指定進行任何的處理.
舉一個除數(shù)為 0 的例子:
#include <iostream> using namespace std; template <typename T> T Div(T x, T y); int main() { // 聲明變量 int x, y; double x1, y1; // 賦值 cin >> x >> y; cin >> x1 >> y1; // 輸出商 cout << x << "/" << y << "=" << Div(x, y) << endl; cout << x1 << "/" << y1 << "=" << Div(x1, y1) << endl; return 0; } template <typename T> T Div(T x, T y) { return x / y; }
輸出結(jié)果:
眾所周知分母不能為 0, 所以在這里我們可以看見程序終止運行了.
異常處理機制
我們把程序運行時的錯誤統(tǒng)稱為異常. 對異常的處理統(tǒng)稱為異常處理. C++ 中所提供的異常處理機制結(jié)構(gòu)清晰, 在一定程度上可以保證程序的健壯性.
C++ 中處理異常的過程:
- 在執(zhí)行程序發(fā)生異常, 可以不在本函數(shù)中處理. 而是拋出一個錯誤信息, 把它傳遞給上一級的函數(shù)來解決. 上一級解決不了, 再傳給其上一級, 由其上一級處理.
- 如此主機上傳, 直到最高一級還無法處理的話, 運行系統(tǒng)會調(diào)用 abort 終止程序.
格式:
try { 被檢查語句 throw 異常 } catch(異常類型1) { 進行異常處理的語句1 } catch(異常類型2) { 進行異常處理的語句2 }
- 把需要檢查的語句放在 try 模塊中
- try 和 catch 作為一個整體出現(xiàn)
- try 和 catch 塊中必須用話括號括起來, 即使花括號內(nèi)只有一個語句
- 檢查語句發(fā)生錯誤, throw 拋出異常, 發(fā)出錯誤信息
- 由 catch 來捕捉異常信息, 并加以處理
- 一個 try-catch 結(jié)構(gòu)中只能有一個 try 塊, 但卻可以有多個 catch 塊, 以便匹配不同的異常信息
- 一般 throw 拋出的異常要和 catch 所捕獲的異常類型所匹配
- catch 后面的圓括號中, 一般只寫異常信息的類型名, 如 catch (double)
- 如果 throw 拋出異常信息找不到與之匹配的 catch 塊, 那么系統(tǒng)就會調(diào)用一個系統(tǒng)函數(shù) terminate, 使程序終止運行
函數(shù)聲明指定異常
我們可以在函數(shù)聲明中指定異常情況, 這樣我們在看程序時能夠知道所用的函數(shù)是否會拋出異常信息以及異常信息可能的類型. C++ 允許在聲明函數(shù)時列出可能拋出的異常類型.
聲明一個不能拋出異常的函數(shù):
double triangle(double,double,double) throw();
聲明一個能拋出異常的函數(shù):
int triangle(int a, int b, int c) throw(runtime_error);
注: 要指定異常類型, 必須在聲明和定義時都指定, 且類型相同.
練習
案例一
防止除數(shù)為 0:
#include <iostream> using namespace std; template <typename T> T Div(T x, T y); int main() { // 聲明變量 int x, y; double x1, y1; // 賦值 cout << "Please enter two int:\n"; cin >> x >> y; cout << "Please enter two double:\n"; cin >> x1 >> y1; try { // 被檢查的語句 cout << x << "/" << y << "=" << Div(x, y) << endl; cout << x1 << "/" << y1 << "=" << Div(x1, y1) << endl; } catch (int) { // 異常類型 cerr << "除數(shù)為 0, 計算錯誤!" << endl; // 異常處理數(shù)據(jù) } catch (double ) { // 異常類型 cerr << "除數(shù)為 0.0, 計算錯誤!" << endl; // 異常處理數(shù)據(jù) } return 0; } template <typename T> T Div(T x, T y) { if (y == 0){ throw y; // 拋出異常 } return x / y; }
輸出結(jié)果:
Please enter two int:
1 2
Please enter two double:
2 0.0
除數(shù)為 0.0, 計算錯誤!
1/2=0
2/0=
案例二
求三角形周長, 防止三邊小于零或組不成三角形.
#include <iostream> using namespace std; int triangle(int a, int b, int c); int main() { // 聲明變量 int a, b, c; // 賦值 cout << "Please enter the three side of the triangle:\n"; cin >> a >> b >> c; try { // 被檢查的語句 cout << "length of the triangle: " << triangle(a, b, c) << endl; } catch (const runtime_error &error) { // 異常類型 cerr << error.what() << endl; // 異常處理數(shù)據(jù) } return 0; } int triangle(int a, int b, int c) { if (a <= 0 || b <= 0 || c <= 0) { throw runtime_error("The sides of the triangle cannot be less than or equal to zero"); } else if (a + b <= c || a + c <= b || b + c <= a) { throw runtime_error("The lengths of three sides can't form triangle"); } return a + b + c; }
輸出結(jié)果:
到此這篇關(guān)于C/C++中異常處理詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++異常處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++利用jsoncpp庫實現(xiàn)寫入和讀取json文件
JsonCpp 是一個C++庫,允許操作 JSON 值,包括序列化和反序列化到字符串和從字符串反序列化。本文主要介紹了如何利用jsoncpp庫實現(xiàn)寫入和讀取json文件,感興趣的可以了解一下2023-04-04C/C++利用棧和隊列實現(xiàn)停車場管理系統(tǒng)
數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計一般都不是很好理解,今天小編為大家總結(jié)了一下c和c++版本的常見棧和隊列的的停車場管理程序,需要的小伙伴可以參考一下2022-06-06C++實現(xiàn)猜數(shù)小游戲的實現(xiàn)
這篇文章主要介紹了C++實現(xiàn)猜數(shù)小游戲的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02C++中實現(xiàn)保存數(shù)據(jù)到CSV文件
這篇文章主要介紹了C++中實現(xiàn)保存數(shù)據(jù)到CSV文件方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08C++與Java分別解決活動選擇問題和帶權(quán)活動選擇問題
這篇文章介紹了C++與Java分別解決活動選擇問題和帶權(quán)活動選擇問題,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06