亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中異常處理的基本思想及throw語句拋出異常的使用

2020-01-26 14:41:17
字體:
來源:轉載
供稿:網友

異常處理基本思想
C++的異常處理的基本思想大致可以概括為傳統錯誤處理機制、通過函數返回值來處理錯誤。

2016314153351173.jpg (377×335)

1)C++的異常處理機制使得異常的引發和異常的處理不必在同一個函數中,這樣底層的函數可以著重解決具體問題,而不必過多的考慮異常的處理。上層調用者可以再適當的位置設計對不同類型異常的處理。
2)異常是專門針對抽象編程中的一系列錯誤處理的,C++中不能借助函數機制,因為棧結構的本質是先進后出,依次訪問,無法進行跳躍,但錯誤處理的特征卻是遇到錯誤信息就想要轉到若干級之上進行重新嘗試,如圖

3)異常超脫于函數機制,決定了其對函數的跨越式回跳。
4)異??缭胶瘮?/p>

異常基本語法

2016314153429533.jpg (577×329)

1) 若有異常則通過throw操作創建一個異常對象并拋擲。
2) 將可能拋出異常的程序段嵌在try塊之中。控制通過正常的順序執行到達try語句,然后執行try塊內的保護段。
3) 如果在保護段執行期間沒有引起異常,那么跟在try塊后的catch子句就不執行。程序從try塊后跟隨的最后一個catch子句后面的語句繼續執行下去。
4) catch子句按其在try塊后出現的順序被檢查。匹配的catch子句將捕獲并處理異常(或繼續拋擲異常)。
5) 如果匹配的處理器未找到,則運行函數terminate將被自動調用,其缺省功能是調用abort終止程序。
6)處理不了的異常,可以在catch的最后一個分支,使用throw語法,向上扔
7)異常機制與函數機制互不干涉,但捕捉的方式是基于類型匹配。捕捉相當于函數返回類型的匹配,而不是函數參數的匹配,所以捕捉不用考慮一個拋擲中的多種數據類型匹配問題。
catch代碼塊必須出現在try后,并且在try塊后可以出現多個catch代碼塊,以捕捉各種不同類型的拋擲。
異常機制是基于這樣的原理:程序運行實質上是數據實體在做一些操作,因此發生異?,F象的地方,一定是某個實體出了差錯,該實體所對應的數據類型便作為拋擲和捕捉的依據。
8)異常捕捉嚴格按照類型匹配
 異常捕捉的類型匹配之苛刻程度可以和模板的類型匹配媲美,它不允許相容類型的隱式轉換,比如,拋擲char類型用int型就捕捉不到.例如下列代碼不會輸出“int exception.”,從而也不會輸出“That's ok.” 因為出現異常后提示退出

int main(){   try{     throw ‘H';   }   catch (int){     cout << "int exception./n";   }   cout << "That's ok./n";    return 0; } 

棧解旋(unwinding)
異常被拋出后,從進入try塊起,到異常被拋擲前,這期間在棧上的構造的所有對象,都會被自動析構。析構的順序與構造的順序相反。這一過程稱為棧的解旋(unwinding)。

#include <iostream> #include <cstdio> using namespace std;   class MyException {};  class Test { public:   Test(int a = 0, int b = 0)   {     this->a = a;     this->b = b;     cout << "Test 構造函數執行" << "a:" << a << " b: " << b << endl;   }   void printT()   {     cout << "a:" << a << " b: " << b << endl;   }   ~Test()   {     cout << "Test 析構函數執行" << "a:" << a << " b: " << b << endl;   } private:   int a;   int b; };  void myFunc() throw (MyException) {   Test t1;   Test t2;    cout << "定義了兩個棧變量,異常拋出后測試棧變量的如何被析構" << endl;    throw MyException(); }  int main() {   //異常被拋出后,從進入try塊起,到異常被拋擲前,這期間在棧上的構造的所有對象,   //都會被自動析構。析構的順序與構造的順序相反。   //這一過程稱為棧的解旋(unwinding)   try   {     myFunc();   }   //catch(MyException &e) //這里不能訪問異常對象   catch (MyException) //這里不能訪問異常對象   {     cout << "接收到MyException類型異常" << endl;   }   catch (...)   {     cout << "未知類型異常" << endl;   }    return 0; } 

異常接口聲明
1)為了加強程序的可讀性,可以在函數聲明中列出可能拋出的所有異常類型,例如:
void func() throw (A, B, C , D); //這個函數func()能夠且只能拋出類型A B C D及其子類型的異常。
2)如果在函數聲明中沒有包含異常接口聲明,則次函數可以拋擲任何類型的異常,例如:
void func();
3)一個不拋擲任何類型異常的函數可以聲明為:
void func() throw();
4) 如果一個函數拋出了它的異常接口聲明所不允許拋出的異常,unexpected函數會被調用,該函數默認行為調用terminate函數中止程序。

傳統處理錯誤

#include <iostream> #include <cstdio> using namespace std;  // 傳統的錯誤處理機制 int myStrcpy(char *to, char *from) {   if (from == NULL) {     return 1;   }   if (to == NULL) {     return 2;   }    // copy時的場景檢查   if (*from == 'a') {     return 3; // copy時錯誤   }   while (*from != '/0') {     *to = *from;     to++;     from++;   }   *to = '/0';    return 0; }  int main() {   int ret = 0;   char buf1[] = "zbcdefg";   char buf2[1024] = { 0 };    ret = myStrcpy(buf2, buf1);   if (ret != 0) {     switch (ret) {     case 1:       cout << "源buf出錯!/n";       break;     case 2:       cout << "目的buf出錯!/n";       break;     case 3:       cout << "copy過程出錯!/n";       break;     default:       cout << "未知錯誤!/n";       break;     }   }   cout << "buf2:/n" << buf2;   cout << endl;    return 0; } 

throw char*

#include <iostream> #include <cstdio> using namespace std;  // throw char * void myStrcpy(char *to, char *from) {   if (from == NULL) {     throw "源buf出錯";   }   if (to == NULL) {     throw "目的buf出錯";   }    // copy時的場景檢查   if (*from == 'a') {     throw "copy過程出錯"; // copy時錯誤   }   while (*from != '/0') {     *to = *from;     to++;     from++;   }   *to = '/0';    return; }  int main() {   int ret = 0;   char buf1[] = "abcdefg";   char buf2[1024] = { 0 };    try   {     myStrcpy(buf2, buf1);   }   catch (int e) // e可以寫可以不寫   {     cout << e << "int類型異常" << endl;   }   catch (char *e)   {     cout << "char* 類型異常" << endl;   }   catch (...)   {   };   cout << endl;    return 0; } 

throw 類對象

#include <iostream> #include <cstdio> using namespace std;  class BadSrcType {}; class BadDestType {}; class BadProcessType { public:   BadProcessType()   {     cout << "BadProcessType構造函數do /n";   }     BadProcessType(const BadProcessType &obj)   {     cout << "BadProcessType copy構造函數do /n";   }    ~BadProcessType()   {     cout << "BadProcessType析構函數do /n";   }  }; 

 
throw 類對象、類型異常 

void my_strcpy3(char *to, char *from) {   if (from == NULL)   {     throw BadSrcType();   }   if (to == NULL)   {     throw BadDestType();   }    //copy是的 場景檢查   if (*from == 'a')   {     printf("開始 BadProcessType類型異常 /n");     throw BadProcessType(); //會不會產生一個匿名對象?   }    if (*from == 'b')   {     throw &(BadProcessType()); //會不會產生一個匿名對象?   }    if (*from == 'c')   {     throw new BadProcessType; //會不會產生一個匿名對象?   }   while (*from != '/0')   {     *to = *from;     to++;     from++;   }   *to = '/0'; }  int main() {   int ret = 0;   char buf1[] = "cbbcdefg";   char buf2[1024] = { 0 };    try   {     //my_strcpy1(buf2, buf1);     //my_strcpy2(buf2, buf1);     my_strcpy3(buf2, buf1);   }   catch (int e) //e可以寫 也可以不寫   {     cout << e << " int類型異常" << endl;   }   catch (char *e)   {     cout << e << " char* 類型異常" << endl;   }    //---   catch (BadSrcType e)   {     cout << " BadSrcType 類型異常" << endl;   }   catch (BadDestType e)   {     cout << " BadDestType 類型異常" << endl;   }   //結論1: 如果 接受異常的時候 使用一個異常變量,則copy構造異常變量.    /*   catch( BadProcessType e) //是把匿名對象copy給e 還是e還是那個匿名對象   {   cout << " BadProcessType 類型異常" << endl;   }   */   /*結論2: 使用引用的話 會使用throw時候的那個對象   catch( BadProcessType &e) //是把匿名對象copy給e 還是e還是那個匿名對象   {   cout << " BadProcessType 類型異常" << endl;   }   */    //結論3: 指針可以和引用/元素寫在一塊 但是引用和元素不能寫在一塊   catch (BadProcessType *e) //是把匿名對象copy給e 還是e還是那個匿名對象   {     cout << " BadProcessType 類型異常" << endl;     delete e;   }    //結論4: 類對象時, 使用引用比較合適     // --   catch (...)   {     cout << "未知 類型異常" << endl;   }    return 0; } 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品美女无圣光视频| 日韩精品极品在线观看播放免费视频| 日本人成精品视频在线| 亚洲天堂日韩电影| 91夜夜未满十八勿入爽爽影院| 精品美女久久久久久免费| 欧美视频国产精品| 久久久久亚洲精品| xxxxx91麻豆| 日本不卡视频在线播放| 亚洲成人黄色网| 性色av一区二区三区| 51精品在线观看| 一区二区三区视频免费在线观看| 精品国产一区二区三区久久狼5月| 色吧影院999| 欧美精品18videos性欧| 国产亚洲欧洲高清| 久久综合伊人77777尤物| 爱福利视频一区| 日韩av网址在线| 久久天天躁夜夜躁狠狠躁2022| 色婷婷亚洲mv天堂mv在影片| 久久99热精品这里久久精品| 91精品国产色综合久久不卡98口| 欧美xxxx18性欧美| 国产欧美日韩精品在线观看| 国产免费一区二区三区在线能观看| 国产精品久久久久久久久借妻| 国自产精品手机在线观看视频| 久久精品国产久精国产一老狼| 亚洲一品av免费观看| 亚洲色图在线观看| 91视频国产一区| 亚洲视频在线看| 性金发美女69hd大尺寸| 日韩av色在线| 亚洲欧美另类国产| 国产香蕉精品视频一区二区三区| 欧美一区视频在线| 在线观看视频99| 久久国产精品视频| 精品成人在线视频| 亚洲成人av资源网| 国产精品99久久久久久久久久久久| 亚洲娇小xxxx欧美娇小| 国产999精品久久久| 亚洲天堂开心观看| 91在线免费观看网站| 国产精品大片wwwwww| 亚洲精品视频免费在线观看| 26uuu久久噜噜噜噜| 欧美日韩999| 91久久精品国产| 亚洲精品美女久久久| 色婷婷综合成人av| 欧美国产日本高清在线| 亚洲网站视频福利| 亚洲人成网站777色婷婷| 久久精品男人天堂| 国产精品视频成人| 日韩免费av一区二区| 国产精品九九久久久久久久| 日韩精品福利网站| 九九九热精品免费视频观看网站| 亚洲成人三级在线| 国产一区二区三区中文| 久久影视三级福利片| 一区二区日韩精品| 日韩美女写真福利在线观看| 黑人巨大精品欧美一区二区| 欧美极品少妇全裸体| 成人免费xxxxx在线观看| 亚洲一区二区免费| 久久久精品影院| 国产午夜精品麻豆| 亚洲情综合五月天| 亚洲成avwww人| 精品偷拍各种wc美女嘘嘘| 中文字幕国产亚洲2019| 亚洲aⅴ男人的天堂在线观看| 欧美精品情趣视频| 亚洲美女又黄又爽在线观看| 国产精自产拍久久久久久| 国产精品欧美一区二区三区奶水| 久久精品电影一区二区| 国产香蕉一区二区三区在线视频| 精品国产31久久久久久| 成人h片在线播放免费网站| 国内精品久久影院| 日本午夜精品理论片a级appf发布| 亚洲精品一区二区在线| 国产精品国内视频| 日韩av中文字幕在线免费观看| 亚洲人成网站在线播| 国产不卡av在线| 成人妇女免费播放久久久| 中文在线资源观看视频网站免费不卡| 色婷婷综合久久久久中文字幕1| 国产欧美一区二区三区在线看| 日韩黄色在线免费观看| 精品国产乱码久久久久久婷婷| 久久国产精品亚洲| 久久久久久综合网天天| 欧美午夜电影在线| 国产欧美日韩免费看aⅴ视频| 久久国产精品久久国产精品| 欧美精品一本久久男人的天堂| 欧美日韩国产限制| 成人中文字幕在线观看| 亚洲成色777777女色窝| 7777kkkk成人观看| 亚洲午夜av久久乱码| 亚洲成avwww人| 久久久久久久久久av| 91国偷自产一区二区三区的观看方式| www.xxxx精品| 97视频人免费观看| 中文字幕自拍vr一区二区三区| 欧美高清自拍一区| 国产999视频| 国产精品久在线观看| 国产精品99一区| 国产免费观看久久黄| 在线成人免费网站| 欧美激情精品久久久久久| 91国产精品91| 国产精品欧美一区二区三区奶水| 性视频1819p久久| 久久这里只有精品视频首页| 91精品国产777在线观看| 日韩精品一区二区三区第95| 亚洲欧美日本伦理| 色综合久久悠悠| 久久久久成人精品| 亚洲理论电影网| 97国产在线观看| 欧美激情精品久久久久| 午夜精品久久久久久久久久久久久| 懂色aⅴ精品一区二区三区蜜月| 亚洲欧美另类自拍| 伊人久久久久久久久久久| 久久这里只有精品视频首页| 久久国产视频网站| 国产日韩欧美在线视频观看| 成人在线视频福利| 久久99热这里只有精品国产| 亚洲第一二三四五区| 久久视频在线播放| 亚洲自拍欧美另类| 国产精品久久一区主播| 亚洲国产精彩中文乱码av| 日韩av片永久免费网站| 亚洲天堂av高清| 亚洲欧美变态国产另类| 97国产精品久久| 国内精品久久久久久久| 日本精品视频在线| 国产精品精品久久久久久| 久久免费福利视频| 欧美xxxx做受欧美.88| 午夜精品免费视频| 亚洲欧美成人精品| 久久精品国产免费观看|