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

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

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

2020-05-23 14:06:58
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++中異常處理的基本思想及throw類拋出異常的使用,也深入談到了異常被拋出后的棧解旋unwinding過程,需要的朋友可以參考下
 

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

C++,異常處理,throw語句,拋出異常

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

C++,異常處理,throw語句,拋出異常

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

異?;菊Z法

C++,異常處理,throw語句,拋出異常

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
久久亚洲综合国产精品99麻豆精品福利| 国产999在线观看| 欧美亚洲国产视频小说| 欧美精品精品精品精品免费| 国产成+人+综合+亚洲欧美丁香花| 中文字幕免费精品一区高清| 91香蕉电影院| 国产精品大陆在线观看| 国产精品精品视频| 精品视频久久久久久久| 国产欧美最新羞羞视频在线观看| 亚洲天堂网在线观看| 亚洲精品国产福利| 国产精品自在线| 美女精品视频一区| 久久手机免费视频| 国产精品免费视频xxxx| 日韩在线视频播放| 色噜噜狠狠狠综合曰曰曰88av| 成人在线免费观看视视频| 亚洲a在线观看| 欧美日韩色婷婷| 在线丨暗呦小u女国产精品| 国产成人+综合亚洲+天堂| 91色视频在线导航| 国产精品va在线| 欧美精品18videos性欧| 精品国内亚洲在观看18黄| 亚洲精品丝袜日韩| 亚洲精品91美女久久久久久久| 亚洲免费一级电影| 亚洲国产精品高清久久久| 国产成人精品一区二区三区| 国产999精品久久久影片官网| 欧美精品激情视频| 亚洲精品美女在线| 91精品国产高清自在线看超| 欧美黄色www| 日韩中文在线中文网三级| 成人激情在线观看| 色妞欧美日韩在线| 国产网站欧美日韩免费精品在线观看| 国产一区二区三区在线免费观看| 国产aaa精品| 国产高清视频一区三区| 久久久久久久999| 精品人伦一区二区三区蜜桃网站| 91亚洲va在线va天堂va国| 欧美激情精品久久久久久| 国产一区二区黄| 亚洲伊人久久大香线蕉av| 国产精品自产拍在线观看中文| 欧美日韩免费在线| 亚洲欧美国产视频| 久久好看免费视频| 91国内揄拍国内精品对白| 国产精品一区二区三区成人| 日韩欧美在线观看| 精品久久久久久久久久国产| 成人性生交大片免费看小说| 亚洲欧美制服中文字幕| 亚洲精品999| 亚洲综合av影视| 色樱桃影院亚洲精品影院| 亚洲精品99久久久久中文字幕| 日韩精品欧美国产精品忘忧草| 国产精品美女久久久久久免费| 一区三区二区视频| 亚洲精品白浆高清久久久久久| 国产综合福利在线| 亚洲一区二区久久久久久久| 日韩a**站在线观看| 欧美精品一区二区三区国产精品| 亚洲男人第一av网站| 国产色综合天天综合网| 日韩av在线网址| 久久久视频在线| 欧美视频国产精品| 日韩一区av在线| 国产精品久久久久久久美男| 国产成人精品一区二区在线| 色婷婷**av毛片一区| 亚洲欧美日韩第一区| 日本一区二区三区在线播放| 亚洲精品视频二区| 亚洲第一av网| 国产91网红主播在线观看| 性色av一区二区咪爱| 一区二区欧美在线| 日韩激情av在线免费观看| 亚洲男人的天堂在线播放| 久久中文字幕在线视频| 欧美视频裸体精品| 国产精品精品视频一区二区三区| 日韩精品免费在线视频| 国产成人精品优优av| 欧美国产欧美亚洲国产日韩mv天天看完整| 久久久久久成人精品| 国产精品视频最多的网站| 日本高清不卡的在线| 久久精品国产久精国产思思| 亚洲永久在线观看| 伊人av综合网| 国产亚洲综合久久| 欧美一性一乱一交一视频| 亚洲精品www久久久久久广东| 国产精品国产三级国产专播精品人| 欧美精品在线播放| 欧美—级高清免费播放| 久久人91精品久久久久久不卡| 国产丝袜一区视频在线观看| 日韩在线播放一区| 欧美激情一级精品国产| 久热精品在线视频| 色综合男人天堂| 欧美日韩成人黄色| 亚洲第一av网| 91牛牛免费视频| 欧美激情视频给我| 国产经典一区二区| 久久精品99国产精品酒店日本| 日韩中文字幕网址| 亚洲护士老师的毛茸茸最新章节| 日韩av一区二区在线| 日韩国产精品亚洲а∨天堂免| 一区二区欧美在线| 久久99久久99精品中文字幕| 亚洲欧美制服中文字幕| 日韩成人av在线| 国产日韩欧美另类| 97精品国产aⅴ7777| 国产成人精品日本亚洲专区61| 久久久久久久久久av| 欧美日韩电影在线观看| 深夜精品寂寞黄网站在线观看| 欧美日本国产在线| 91po在线观看91精品国产性色| 亚洲人午夜精品免费| 丰满岳妇乱一区二区三区| 日韩在线不卡视频| 中文字幕精品久久久久| 性色av一区二区三区| 成人在线小视频| 97国产精品人人爽人人做| 亚洲一区二区三区四区在线播放| 亚洲视频999| 国产欧美一区二区白浆黑人| 亚洲国产精品一区二区三区| 久久久亚洲国产| 亚洲精品成人av| 欧美视频免费在线| 国产精品最新在线观看| 日本中文字幕成人| 精品国产91久久久久久| 亚洲精品国产电影| 欧美视频一二三| 色偷偷偷亚洲综合网另类| 成人淫片在线看| 中文字幕精品国产| 久久精品在线播放| 欧美猛男性生活免费| 成人午夜黄色影院| 欧美激情亚洲自拍| 国产成人97精品免费看片|