c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)
異常基本概念
異常處理就是處理程序中的錯誤,所謂錯誤是指在程序運行的過程中發生的一些異常事件(如:除0退出,數組下標越界,所要讀取的文件不存在,空指針,內存不足等等)
c語言中處理異常
兩種方法:
使用整形的返回值標識錯誤;
使用errno宏(可以簡單的理解為一個全局整形變量)去記錄錯誤,當然c++中仍然可以用這兩種方法的。
這兩種方法最大的缺陷就是會出現不一致問題,例如有些函數返回1表示成功,有些則返回0表示成功
還有一個缺點就是函數的返回值只有一個,你通過函數的返回值表示錯誤代碼,那么函數就不能返回其他的值。當然,你也可以通過指針或者c++的引用來返回另外的值,但是這樣可能會令你的程序比較難懂
c++中處理異常
異常的基本使用
try試圖執行try{}中的內容
在可能出現異常的地方 拋出異常 throw
try下面catch捕獲異常
catch(捕獲類型)...代表 所有其他類型
如果不想處理異常,繼續向上拋出throw
如果沒有任何處理異常的地方,那么成員調用terminate函數中斷
自定義異常類,可以拋出自定義的對象
#include<iostream>using namespace std;class myException //自定義異常類 { public:void printError(){cout << "自定義的異常" << endl;} };int myDevide(int a, int b) {if (b == 0){//如果b是異常,拋出異常//return -1;//throw - 1; 拋出int類型異常//throw 3.14;//拋出double類型異常 異常必須處理//throw 'a';throw myException(); //匿名對象}return a / b; }void test01(){int a = 10;int b = 0;//int ret = myDevide(a, b);//早期如果返回-1 無法區分到底是結果還是異常//c++中異常處理try{myDevide(a, b);}catch (int)//捕獲異常{cout << "int 類型異常捕獲" << endl;}catch (double){//如果不想處理這個異常,可以向繼續向上拋出throw;cout << "double類型異常捕獲" << endl;}catch (myException e){e.printError();}catch (...){cout << "其他異常類型捕獲" << endl;}}int main() {try{test01();}catch (double) //如果異常都沒處理,那么成員terminate函數,使程序中斷{cout << "main函數中double類型異常捕獲" << endl;}catch (...){cout << "main函數中其他異常類型捕獲" << endl;}//test01();system("pause");return 0; }總結:
若有異常則通過throw操作創建一個異常對象并拋出
將可能拋出異常的程序投放到try塊之中
如果在try段執行期間沒有引起異常,那么跟在try后面的catch字句就不會執行
catch子句會根據出現的先后順序被檢查,匹配的catch語句捕獲并處理異常(或繼續拋出異常)
如果匹配的處理來找到,則運行函數terminate將自動被調用,其缺省功能調用abort終止程序
處理不了的異常,可以在catch的最后一個分支,使用throw,向上拋
c++異常處理使得異常的引發和異常的處理不必在一個函數中,這樣底層可以著重解決具體問題,而不必過多的考慮異常的處理,上層調用者可以在適當的位置設計對不同類型異常的處理
#include<iostream>using namespace std;class myException //自定義異常類{public:void printError(){cout << "自定義的異常" << endl;}};int myDevide(int a, int b){if (b == 0){//如果b是異常,拋出異常//return -1;//throw - 1; 拋出int類型異常//throw 3.14;//拋出double類型異常 異常必須處理//throw 'a';throw myException(); //匿名對象}return a / b;}void test01(){int a = 10;int b = 0;//int ret = myDevide(a, b);//早期如果返回-1 無法區分到底是結果還是異常//c++中異常處理try{myDevide(a, b);}catch (int)//捕獲異常{cout << "int 類型異常捕獲" << endl;}catch (double){//如果不想處理這個異常,可以向繼續向上拋出throw;cout << "double類型異常捕獲" << endl;}catch (myException e){e.printError();}catch (...){cout << "其他異常類型捕獲" << endl;}}int main(){try{test01();}catch (double) //如果異常都沒處理,那么成員terminate函數,使程序中斷{cout << "main函數中double類型異常捕獲" << endl;}catch (...){cout << "main函數中其他異常類型捕獲" << endl;}//test01();system("pause");return 0;}棧解旋
從try開始到throw拋出異常之前,所有棧上的對象都會被釋放,這個過程稱為棧解旋,構造析構順序相反
棧上對象構造順序與析構順序相反
class Person{public:Person(){cout << "Person構造" << endl;}~Person(){cout << "Person析構" << endl;}};int myDevide(int a, int b){if (b == 0){//如果b是異常,拋出異常//return -1;//throw - 1; 拋出int類型異常//throw 3.14;//拋出double類型異常 異常必須處理//throw 'a';//棧解旋//從try開始到throw拋出異常之前,所有棧上的對象都會被釋放//這個過程稱為棧解旋//構造析構順序相反Person p1;Person p2;throw myException(); //匿名對象}return a / b;}總結
以上是生活随笔為你收集整理的c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 青春日记剧情介绍
- 下一篇: 泰拉瑞亚暗影之魂怎么获得