C++ 异常,标准异常类,自定义异常类,throw,try,catch语句
生活随笔
收集整理的這篇文章主要介紹了
C++ 异常,标准异常类,自定义异常类,throw,try,catch语句
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
要學(xué)習(xí)異常,首先就要學(xué)習(xí)throw和try,catch語句:
C++中try catch語句用法有非常靈活,有許多種組合;
這里簡單介紹以下最基本的用法;
1. 格式
try{ ... } catch{ ... }try語句塊是用來判斷是否有異常;
catch語句塊捕捉異常,并進(jìn)行處理;
throw是拋出異常;
2. 實(shí)例
?
首先通過一個簡單的例子來熟悉C++ 的?try/catch/throw(可根據(jù)單步調(diào)試來熟悉,try catch throw部分是如何運(yùn)行的):
#include <iostream> #include <exception> using namespace std; int main () { try { throw 1; throw "error"; } catch(char *str) { cout << str << endl; } catch(int i) { cout << i << endl; } } #include <stdlib.h> #include "iostream" using namespace std;double fuc(double x, double y) //定義函數(shù) {if(y==0){throw y; //除數(shù)為0,拋出異常}return x/y; //否則返回兩個數(shù)的商 }int _tmain(int argc, _TCHAR* argv[]) {double res;try //定義異常{res=fuc(2,3);cout<<"The result of x/y is : "<<res<<endl;res=fuc(4,0); //出現(xiàn)異常}catch(double) //捕獲并處理異常{cerr<<"error of dividing zero.\n";exit(1); //異常退出程序}return 0; }?
?
【注】:catch 的數(shù)據(jù)類型需要與throw出來的數(shù)據(jù)類型相匹配的。
catch(…)能夠捕獲多種數(shù)據(jù)類型的異常對象,所以它提供給程序員一種對異常對象更好的控制手段,使開發(fā)的軟件系統(tǒng)有很好的可靠性。因此一個比較有經(jīng)驗(yàn)的程序員通常會這樣組織編寫它的代碼模塊,如下:
void Func() {try{// 這里的程序代碼完成真正復(fù)雜的計算工作,這些代碼在執(zhí)行過程中// 有可能拋出DataType1、DataType2和DataType3類型的異常對象。}catch(DataType1& d1){}catch(DataType2& d2){}catch(DataType3& d3){}/*********************************************************注意上面try block中可能拋出的DataType1、DataType2和DataType3三種類型的異常對象在前面都已經(jīng)有對應(yīng)的catch block來處理。但為什么還要在最后再定義一個catch(…) block呢?這就是為了有更好的安全性和可靠性,避免上面的try block拋出了其它未考慮到的異常對象時導(dǎo)致的程序出現(xiàn)意外崩潰的嚴(yán)重后果,而且這在用VC開發(fā)的系統(tǒng)上更特別有效,因?yàn)閏atch(…)能捕獲系統(tǒng)出現(xiàn)的異常,而系統(tǒng)異常往往令程序員頭痛了,現(xiàn)在系統(tǒng)一般都比較復(fù)雜,而且由很多人共同開發(fā),一不小心就會導(dǎo)致一個指針變量指向了其它非法區(qū)域,結(jié)果意外災(zāi)難不幸發(fā)生了。catch(…)為這種潛在的隱患提供了一種有效的補(bǔ)救措施。*********************************************************/catch(…){} }自定義異常類:
#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; } //標(biāo)準(zhǔn)異常類 #include<iostream>//頭文件 #include<stdExcept> using namespace std;/* 標(biāo)準(zhǔn)異常類體系如下: 縮進(jìn)層次表示繼承關(guān)系 exception #include <exception>runtime_error #include <stdexcept>overflow_errorunderflow_errorrange_errorlogic_error #include <stdexcept>invalid_argumentlength_errorout_of_rangedomain_errorbad_alloc <new>bad_exceptionbad_cast <typeinfo>bad_typeid <typeinfo> 它們都是類。需要引用的頭文件已經(jīng)標(biāo)注。沒有標(biāo)的,那么它的頭文件就是上一層的頭文件。 *///自定義異常類,繼承自exception class myException :public exception { public:myException(char* c){m_p = c;}//what()函數(shù)返回錯誤信息virtual char* what(){cout << "異常類型為 myException: "<< m_p << endl;return m_p;} private:char *m_p; };void test_func() {throw myException("出錯啦!");//throw bad_alloc(); } int main() {try{test_func();}catch (myException& e){e.what();}catch (bad_alloc& e){e.what();}catch (...){cout << "Unknown Error" << endl;}system("pause");return 0; }?
參考資料:
https://www.cnblogs.com/MrYuan/p/4800257.html
https://blog.csdn.net/misayaaaaa/article/details/90108912
總結(jié)
以上是生活随笔為你收集整理的C++ 异常,标准异常类,自定义异常类,throw,try,catch语句的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简直防不胜防!吐槽手机系统中花样百出的广
- 下一篇: 建设银行信用卡优惠 办卡送Q币