日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋)

發布時間:2023/11/30 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中的异常--1(基本概念, c语言中处理异常,c++中处理异常,异常的基本使用,栈解旋) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

異常基本概念

異常處理就是處理程序中的錯誤,所謂錯誤是指在程序運行的過程中發生的一些異常事件(如:除0退出,數組下標越界,所要讀取的文件不存在,空指針,內存不足等等)

c語言中處理異常

兩種方法:

  • 使用整形的返回值標識錯誤;

  • 使用errno宏(可以簡單的理解為一個全局整形變量)去記錄錯誤,當然c++中仍然可以用這兩種方法的。

  • 這兩種方法最大的缺陷就是會出現不一致問題,例如有些函數返回1表示成功,有些則返回0表示成功

  • 還有一個缺點就是函數的返回值只有一個,你通過函數的返回值表示錯誤代碼,那么函數就不能返回其他的值。當然,你也可以通過指針或者c++的引用來返回另外的值,但是這樣可能會令你的程序比較難懂

  • c++中處理異常

  • 函數的返回值可以忽略,但異常不可忽略,如果程序出現異常,但是沒有被捕獲,程序就會終止,這多少會促使程序員開發出來的程序更健壯一點,而如果使用C語言的errot宏或者函數的返回值,調用者都有可能忘記檢查,從而沒有對錯進行處理,結果造成程序員莫名其妙的終止或出現錯誤的結果
  • 整型返回值沒有任何語義信息,而異常卻包含語義信息,有時你從類名就能狗體現出來
  • 整型返回值缺乏相關的上下文信息,異常作為一個類,可以擁有自己的成員,這些成員可以傳遞足夠的信息
  • 異常處理可以在調用跳級。這是一個代碼編寫時的問題:假設在有多個函數的調用棧中出現某個錯誤,使用整型返回碼要求你在每一級函數中都要進行處理,而使用異常處理的棧展開機制,只需要在一處進行處理就可以,不需要每級函數都處理
  • 異常的基本使用

  • 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++中处理异常,异常的基本使用,栈解旋)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。