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

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

解析C++編程中異常相關的堆棧展開和throw()異常規范

2020-05-23 14:09:06
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了C++編程中異常相關的堆棧展開和throw()異常規范,throw()規范部分文中結合了C++11標準的新特性來講,需要的朋友可以參考下
 

C++ 中的異常和堆棧展開
在 C++ 異常機制中,控制從 throw 語句移至可處理引發類型的第一個 catch 語句。在到達 catch 語句時,throw 語句和 catch 語句之間的范圍內的所有自動變量將在名為“堆棧展開”的過程中被銷毀。在堆棧展開中,執行將繼續,如下所示:
控制通過正常順序執行到達 try 語句。執行 try 塊內的受保護部分。
如果執行受保護的部分的過程中未引發異常,將不會執行 try 塊后面的 catch 子句。執行將在關聯的 try 塊后的最后一個 catch 子句后面的語句上繼續。
如果執行受保護部分的過程中或在受保護的部分調用的任何例程中引發異常(直接或間接),則從通過 throw 操作數創建的對象中創建異常對象。(這意味著,可能會涉及復制構造函數。)此時,編譯器會在權限更高的執行上下文中查找可處理引發的類型異常的 catch 子句,或查找可以處理任何類型的異常的 catch 處理程序。按照 catch 處理程序在 try 塊后面的顯示順序檢查這些處理程序。如果未找到適當的處理程序,則檢查下一個動態封閉的 try 塊。此過程將繼續,直到檢查最外面的封閉 try 塊。
如果仍未找到匹配的處理程序,或者在展開過程中但在處理程序獲得控制前發生異常,則調用預定義的運行時函數 terminate。如果在引發異常后但在展開開始前發生異常,則調用 terminate。
如果找到匹配的 catch 處理程序,并且它通過值進行捕獲,則通過復制異常對象來初始化其形參。如果它通過引用進行捕獲,則初始化參數以引用異常對象。在初始化形參后,堆棧的展開過程將開始。這包括對與 catch 處理程序關聯的 try 塊的開頭和異常的引發站點之間完全構造(但尚未析構)的所有自動對象的析構。析構按照與構造相反的順序發生。執行 catch 處理程序且程序會在最后一個處理程序之后(即,在不是 catch 處理程序的第一個語句或構造處)恢復執行??刂浦荒芡ㄟ^引發的異常進入 catch 處理程序,而絕不會通過 goto 語句或 switch 語句中的 case 標簽進入。
堆棧展開示例
以下示例演示引發異常時如何展開堆棧。線程執行將從 C 中的 throw 語句跳轉到 main 中的 catch 語句,并在此過程中展開每個函數。請注意創建 Dummy 對象的順序,并且會在它們超出范圍時將其銷毀。還請注意,除了包含 catch 語句的 main 之外,其他函數均未完成。函數 A 絕不會從其對 B() 的調用返回,并且 B 絕不會從其對 C() 的調用返回。如果取消注釋 Dummy 指針和相應的 delete 語句的定義并運行程序,請注意絕不會刪除該指針。這說明了當函數不提供異常保證時會發生的情況。有關詳細信息,請參閱“如何:針對異常進行設計”。如果注釋掉 catch 語句,則可以觀察當程序因未經處理的異常而終止時將發生的情況。

#include <string>#include <iostream>using namespace std;class MyException{};class Dummy{ public: Dummy(string s) : MyName(s) { PrintMsg("Created Dummy:"); } Dummy(const Dummy& other) : MyName(other.MyName){ PrintMsg("Copy created Dummy:"); } ~Dummy(){ PrintMsg("Destroyed Dummy:"); } void PrintMsg(string s) { cout << s << MyName << endl; } string MyName;  int level;};void C(Dummy d, int i){  cout << "Entering FunctionC" << endl; d.MyName = " C"; throw MyException();  cout << "Exiting FunctionC" << endl;}void B(Dummy d, int i){ cout << "Entering FunctionB" << endl; d.MyName = "B"; C(d, i + 1);  cout << "Exiting FunctionB" << endl; }void A(Dummy d, int i){  cout << "Entering FunctionA" << endl; d.MyName = " A" ; // Dummy* pd = new Dummy("new Dummy"); //Not exception safe!!! B(d, i + 1); // delete pd;  cout << "Exiting FunctionA" << endl; }int main(){ cout << "Entering main" << endl; try {  Dummy d(" M");  A(d,1); } catch (MyException& e) {  cout << "Caught an exception of type: " << typeid(e).name() << endl; } cout << "Exiting main." << endl; char c; cin >> c;}
輸出:
 Entering main Created Dummy: M Copy created Dummy: M Entering FunctionA Copy created Dummy: A Entering FunctionB Copy created Dummy: B Entering FunctionC Destroyed Dummy: C Destroyed Dummy: B Destroyed Dummy: A Destroyed Dummy: M Caught an exception of type: class MyException Exiting main.

 

 

異常規范 (throw)
異常規范是在 C++11 中棄用的 C++ 語言功能。這些規范原本用來提供有關可從函數引發哪些異常的摘要信息,但在實際應用中發現這些規范存在問題。證明確實有一定用處的一個異常規范是 throw() 規范。例如:

 

void MyFunction(int i) throw();

告訴編譯器函數不引發任何異常。它相當于使用 __declspec(nothrow)。這種用法是可選的。
(C++11) 在 ISO C++11 標準中,引入了 noexcept 運算符,該運算符在 Visual Studio 2015 及更高版本中受支持。盡可能使用 noexcept 指定函數是否可能會引發異常。
Visual C++ 中實現的異常規范與 ISO C++ 標準有所不同。下表總結了 Visual C++ 的異常規范實現:

 

異常規范 含義
throw() 函數不會引發異常。但是,如果從標記為 throw() 函數引發異常,Visual C++ 編譯器將不會調用意外處理函數。如果使用 throw() 標記一個函數,則 Visual C++ 編譯器假定該函數不會引發 C++ 異常,并相應地生成代碼。由于 C++ 編譯器可能會執行代碼優化(基于函數不會引發任何 C++ 異常的假設),因此,如果函數引發異常,則程序可能無法正確執行。
throw(...) 函數可以引發異常。
throw(type) 函數可以引發 type 類型的異常。但是,在 Visual C++ .NET 中,這被解釋為 throw(...)。

 

 

如果在應用程序中使用異常處理,則一定有一個或多個函數處理引發的異常。在引發異常的函數和處理異常的函數間調用的所有函數必須能夠引發異常。
函數的引發行為基于以下因素:

  • 您是否在 C 或 C++ 下編譯函數。
  • 您所使用的 /EH 編譯器選項。
  • 是否顯式指定異常規范。

不允許對 C 函數使用顯式異常規范。

下表總結了函數的引發行為:

解析C++編程中異常相關的堆棧展開和throw()異常規范

 

// exception_specification.cpp// compile with: /EHs#include <stdio.h>void handler() { printf_s("in handler/n");}void f1(void) throw(int) { printf_s("About to throw 1/n"); if (1)  throw 1;}void f5(void) throw() { try {  f1(); } catch(...) {  handler(); }}// invalid, doesn't handle the int exception thrown from f1()// void f3(void) throw() {// f1();// }void __declspec(nothrow) f2(void) { try {  f1(); } catch(int) {  handler(); }}// only valid if compiled without /EHc // /EHc means assume extern "C" functions don't throw exceptionsextern "C" void f4(void);void f4(void) { f1();}int main() { f2(); try {  f4(); } catch(...) {  printf_s("Caught exception from f4/n"); } f5();}

輸出:

About to throw 1in handlerAbout to throw 1Caught exception from f4About to throw 1in handler


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人在线视频| 欧美久久精品一级黑人c片| 欧洲成人在线视频| 亚洲国产成人久久综合| 色哟哟亚洲精品一区二区| 97国产一区二区精品久久呦| 欧美在线视频在线播放完整版免费观看| 色噜噜狠狠狠综合曰曰曰88av| 欧美中文字幕视频| 欧美一区亚洲一区| 91高清免费视频| 国产97在线观看| 欧美日韩国产二区| 精品一区二区三区四区在线| 日韩av一区在线| 成人看片人aa| 久久久久久九九九| 亚洲一区二区福利| 亚洲开心激情网| 成人亚洲激情网| 大桥未久av一区二区三区| 亚洲精品在线观看www| 国产精品电影观看| 日韩电影免费观看中文字幕| 亚洲女同精品视频| 日韩中文字幕久久| 亚洲欧洲日本专区| 亚洲激情久久久| 亚洲专区中文字幕| 不卡中文字幕av| 性视频1819p久久| 欧美大片在线免费观看| 亚洲人成啪啪网站| 欧美精品午夜视频| 日韩在线视频播放| 91极品视频在线| 韩国日本不卡在线| www.欧美免费| 国产mv久久久| 久久99精品国产99久久6尤物| 久久久久久97| 日本欧美爱爱爱| 红桃视频成人在线观看| 国产精品久久久久久久久久久久久久| 欧美日韩成人在线播放| 欧美在线免费视频| 一区二区欧美激情| 国产精品久久久久久久久久久不卡| 久久久噜噜噜久噜久久| 欧美性xxxx极品hd欧美风情| 国内精品久久久久| 国产成人精品av在线| 久久国产精品网站| 91产国在线观看动作片喷水| 欧美一区在线直播| 欧美在线视频网站| 日韩成人在线网站| 88国产精品欧美一区二区三区| 欧美在线视频一区二区| 97精品国产91久久久久久| 久久久久久久久久久久久久久久久久av| 中文字幕av一区中文字幕天堂| 日韩欧美中文在线| 国产综合在线观看视频| 成人免费淫片视频软件| 亚洲理论在线a中文字幕| 精品国产乱码久久久久久虫虫漫画| 亚洲国产精品99久久| 日韩精品一二三四区| 国产午夜精品全部视频在线播放| 97精品视频在线| 欧洲精品毛片网站| 日韩亚洲精品视频| 日韩精品一区二区三区第95| 91国内揄拍国内精品对白| 亚洲精品98久久久久久中文字幕| 欧美激情国产精品| 韩国19禁主播vip福利视频| 亚洲精品久久久久久久久久久久| 亚洲香蕉成视频在线观看| 国产精品精品视频一区二区三区| 欧美日韩中文在线观看| 91久久国产精品91久久性色| 一区二区三区四区视频| 91手机视频在线观看| 亚洲free性xxxx护士hd| 欧美日韩一区二区精品| 久久综合久中文字幕青草| 欧美一级视频免费在线观看| 成人在线视频福利| 国产精品一区=区| 欧美在线视频播放| 日韩美女在线观看一区| 国产精品视频白浆免费视频| 欧美日韩一区二区免费在线观看| 91精品国产综合久久久久久久久| 欧美激情中文字幕在线| 成人免费在线网址| 精品国产自在精品国产浪潮| 尤物九九久久国产精品的分类| 爱福利视频一区| 国产91热爆ts人妖在线| 色偷偷综合社区| 伊人伊成久久人综合网小说| 亚洲综合色av| 亚洲最大成人网色| 亚洲视频精品在线| 久久中国妇女中文字幕| 中文字幕在线精品| 永久555www成人免费| 国产精品久久久久国产a级| 欧美国产日韩免费| 国产精品扒开腿做| 亚洲一二在线观看| 91精品91久久久久久| 国产性猛交xxxx免费看久久| 欧美精品成人91久久久久久久| 欧美乱人伦中文字幕在线| 日韩福利伦理影院免费| 欧美另类在线播放| 日韩电影在线观看永久视频免费网站| 国产精品视频网站| 亚洲自拍欧美色图| 亚洲国产精品网站| 亚洲国产女人aaa毛片在线| 欧美日韩在线视频观看| 日韩在线免费av| 日韩国产在线播放| 国产精品第一页在线| 国产日韩欧美视频在线| 亚洲精品v天堂中文字幕| 日韩av在线网址| 欧美成人中文字幕在线| 高清欧美电影在线| 久久久久久久影视| 欧美在线观看网址综合| 九九热这里只有在线精品视| 国产精品精品久久久| 久久精品久久久久久| 欧美国产日韩一区二区三区| 欧美色xxxx| 欧美国产亚洲精品久久久8v| 国产91久久婷婷一区二区| 亚洲天堂开心观看| 亚洲a区在线视频| 亚洲天堂av在线播放| 亚洲性av网站| 精品日本美女福利在线观看| 青青精品视频播放| 亚洲欧洲日本专区| 中文字幕精品国产| 亚洲人成电影在线| 亚洲高清久久网| 在线电影欧美日韩一区二区私密| 精品伊人久久97| 成人情趣片在线观看免费| 色噜噜亚洲精品中文字幕| 国产精自产拍久久久久久蜜| 51午夜精品视频| 日韩在线观看免费av| 欧美亚洲成人免费| 亚洲一区二区自拍| 亚洲香蕉伊综合在人在线视看| 影音先锋日韩有码|