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

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

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

2020-05-23 14:09:06
字體:
供稿:網(wǎng)友
這篇文章主要介紹了C++編程中異常相關(guān)的堆棧展開和throw()異常規(guī)范,throw()規(guī)范部分文中結(jié)合了C++11標(biāo)準(zhǔn)的新特性來講,需要的朋友可以參考下
 

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

#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.

 

 

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

 

void MyFunction(int i) throw();

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

 

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

 

 

如果在應(yīng)用程序中使用異常處理,則一定有一個或多個函數(shù)處理引發(fā)的異常。在引發(fā)異常的函數(shù)和處理異常的函數(shù)間調(diào)用的所有函數(shù)必須能夠引發(fā)異常。
函數(shù)的引發(fā)行為基于以下因素:

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

不允許對 C 函數(shù)使用顯式異常規(guī)范。

下表總結(jié)了函數(shù)的引發(fā)行為:

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

 

// 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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
亚洲国产高清国产精品| 久久综合丝袜日本网| 亚洲综合久久久久| 91国产精品| 不卡一卡2卡3卡4卡精品在| 在线国产一区| 亚洲精品国产无天堂网2021| 国产乱码精品一区二区三| 欧美视频一二三| xxx一区二区| 日韩福利片在线观看| 亚洲精品电影院| 久久露脸国语精品国产91| 成人字幕网zmw| 精品剧情v国产在线观看| 手机在线成人av| 国产激情视频一区二区三区| 亚洲成人av免费看| 视频在线一区二区三区| 国产人妻精品久久久久野外| 手机看片福利在线| 北岛玲一区二区三区| 被下部羞羞漫画| 韩国日本在线视频| 日韩av电影免费在线观看| 久久精品久久精品国产大片| www.黄在线观看| 久久99久久99精品中文字幕| 亚洲欧美日韩综合精品网| 国产一区自拍视频| 亚洲国产电影在线观看| 黄瓜视频成人app免费| 国产aⅴ激情无码久久久无码| 日韩美女视频网站| 日韩精品免费电影| gogogo高清在线观看一区二区| av网址在线观看免费| 国外成人在线播放| 1234区中文字幕在线观看| 91色p视频在线| 一个人在线观看免费视频www| 成人免费a**址| 男人舔女人下面高潮视频| 日韩在线高清| 91精品欧美综合在线观看最新| 国产在线一区二区综合免费视频| 亚洲乱码一区二区三区| 91极品在线| 欧洲激情一区二区| 凹凸av导航大全精品| 国产欧美在线| av中文字幕在线观看第一页| 日本人体一区二区| 国产美女在线一区二区三区| 成人网址在线观看| 91官网在线免费观看| 在线视频一区二区三| 国产成人啪精品视频免费网| 亚洲精品成人av| 久久国产精品久久久久久电车| 欧美伦理片在线观看| 麻豆一区二区三区| 另类专区亚洲| 另类图片国产| 日韩国产一区三区| 超碰在线人人干| 亚洲一区二区日韩| 亚洲三级网页| 九色精品高清在线播放| 在线成人福利| 欧美午夜电影网| 国产日韩欧美一二三区| 色噜噜成人av在线| 在线免费观看视频一区| 久久亚洲成人| 亚洲免费视频一区二区三区| 日韩的一区二区| 亚洲一区一卡| 日韩欧美视频网站| 久久久久成人网| 国产成人短视频| 亚洲无线码一区二区三区| 老**午夜毛片一区二区三区| 美日韩在线视频| 久久人人爽爽爽人久久久| 国产资源第一页| 黄色毛片在线| 偷窥国产亚洲免费视频| 亚洲欧美日韩一区二区三区在线| 欧美精品一区二区三区精品| 麻豆中文一区二区| 秋霞午夜在线观看| 国产东北露脸精品视频| 97精品国产97久久久久久久久久久久| 中国一级免费毛片| 999这里只有精品| 亚洲午夜精品久久久久久app| 日韩一区二区不卡视频| 午夜精品电影| 国产一级久久久| 亚洲精品在线视频免费观看| 日韩在线 中文字幕| 欧美一级国产精品| 成人欧美视频在线观看播放| 国产精品porn| 美女胸又www又黄的网站| 香蕉视频999| 成人av动漫| www,av在线| 久久久久久久久久久网站| 免费一区二区三区在线视频| 日本久久久久久久久| 波多野吉衣av| 国产大学生粉嫩无套流白浆| 国产大学生av| 亚洲欧洲精品一区二区三区波多野1战4| 欧美日韩a区| wwwwww.色| av动漫在线免费观看| 亚洲国产成人一区二区三区| 欧美精品成人| 成人免费看片98| 激情视频免费网站| 日韩欧美在线视频观看| 亚洲破处大片| 国产午夜精品视频一区二区三区| 欧美在线中文字幕高清的| 97人人模人人爽人人澡| 免费观看欧美大片| 91麻豆精品一区二区三区| 国产成人无码精品久久久久| 欧美wwwsss9999| 欧美老女人bb| 青草青青在线视频| 国产精品粉嫩av| 欧美成人69av| 亚洲 国产 日韩 综合一区| 免费成人黄色| 精品国产一区二区三区不卡在线| 精品国产一区二区三区四区在线观看| 午夜国产精品视频免费体验区| av成人激情| 国产精品私人影院| 亚洲av人无码激艳猛片服务器| 国产成人精品日本亚洲专区61| 久久精品综合| 欧美精品一二三区| 亚洲女人被黑人巨大进入| 草草影院第一页| 99久久人妻无码中文字幕系列| 欧美中文字幕第一页| 91精品国产综合久久久蜜臀粉嫩| 在线免费观看亚洲| 五月激情五月婷婷| 国产又黄又大又粗视频| 麻豆av一区二区三区| 色妞在线综合亚洲欧美| 久久精品国产久精国产| 国产精品腿扒开做爽爽爽挤奶网站| 老湿机69福利| 伊人网站在线观看| 在线中文字幕一区二区| 一本一本久久a久久精品综合小说| 自拍偷拍国产亚洲| 国产福利久久精品| 26uuu亚洲综合色| 波多野结衣三级在线| 17c丨国产丨精品视频| 精品一区二区三区影院在线午夜| 中文字幕在线播放视频| 亚洲精品ww久久久久久p站| 欧美三级电影在线观看| 嫩草影院永久入口| 成年人在线网站| 亚洲成人网在线观看| 疯狂做受xxxⅹ高潮视频免费| 久久亚洲国产精品一区二区| 最新欧美精品一区二区三区| 国产精品一区二区三区毛片淫片| 你懂的国产视频| 97超碰欧美中文字幕| 国产精品久久久久久久app| 色播视频在线播放| 久久99国产精品99久久| 成人av一区二区三区在线观看| 国产91国语对白在线| 欧美另类视频在线| 欧美自拍偷拍第一页| 成年女人在线看片| 国产一二三区在线| 91最新地址在线播放| 日韩在线网址| 日本小视频在线免费观看| 精产国品自在线www| 亚洲女同女同女同女同女同69| 国产精品99久久久久久董美香| 日韩在线观看免费av| 黄污视频在线观看| 日韩精品在线视频免费观看| 久久久精品国产免费观看同学| 日韩精品一区二区三区视频在线观看| 久久中文字幕免费| 国产不卡一二三区| 亚洲精品自产拍| 理论视频在线观看| 高清不卡一区二区在线| 久久综合久久鬼色中文字| 天天影视综合色| www.夜色| 三级在线观看| 精品国产一区二区国模嫣然| 亚洲视频高清| 国产免费一区视频观看免费| 999av视频| 午夜在线视频一区二区区别| 精品国产凹凸成av人网站| 91视频你懂的| 久久久国产成人| 久久国产精品久久久| 国产精品久久一区二区三区| 亚洲激情欧美色图| 欧美性色黄大片手机版| 亚洲免费高清视频在线| 久久综合狠狠综合久久综合88| 亚洲视频在线一区| 国产乱淫av片| 最近免费中文字幕大全免费版视频| 91网上在线视频| 中文字幕伦理片| 免费看91的网站| 欧美精品久久一区二区三区| 最新国产在线精品91尤物| 一区二区三区加勒比av| 在线精品视频在线观看高清| 亚洲欧美激情另类| jiuse九色最新地址| 久久久成人影院| 高h视频在线| 青青青视频在线免费观看| 日韩av电影免费播放| 久久精品国产亚洲7777| 久久国产波多野结衣| theporn国产精品| 男人艹女人在线观看| 黄色小视频免费在线观看| 成人精品久久久| 亚洲最新av网址| 婷婷无套内射影院| 666精品在线| 国产成人亚洲精品| 97碰碰碰免费公开在线视频| 人人精品久久| 亚洲精品国偷自产在线99热| 国产精品福利一区二区三区| 69堂视频在线观看国产| 久久精品视频网站| 久久久久成人精品无码| 中文字幕久久久av一区| 污片视频在线免费观看| 欧美一区二区三区播放老司机| 久久久久久人妻一区二区三区| 妺妺窝人体色www聚色窝仙踪| 久久精精品视频| 中文字幕高清20页| 91亚洲国产成人精品一区二三| 99视频一区| 欧美成人三级电影在线| 国产伦精品一区二区三区妓女下载| 日韩精品你懂的| 麻豆精品久久久久久久99蜜桃| 亚洲精品高清无码视频| 全色精品综合影院| 亚洲精品一区二区在线看| 18岁成年人网站| 欧美性猛交xx乱大交| 日韩精品中午字幕| 欧美xxxx综合视频| 99精品在线免费在线观看| 亚洲精品一区国产精品| 51国偷自产一区二区三区| 99热在线免费观看| 在线视频精品一区| 国产在线视频你懂得| 亚洲欧美日韩电影| 色哟哟视频在线| 午夜精品一区在线观看| 日韩一二三区视频| 久久久久人妻一区精品色欧美| 精品国产18久久久久久二百| 亚洲精品成人悠悠色影视| 欧美日韩一区二区电影| 国产欧美一区二区三区在线看| 欧美一区二区国产| 国产精品美女久久久久久久| 麻豆免费网站| 亚洲天堂视频在线播放| 成年大片免费视频播放二级| 免费看成人哺乳视频网站| 教室别恋欧美无删减版| 日本成人xxx| 天堂综合在线播放| 成年在线观看视频| 欧美一区二区黄| 成人高潮aa毛片免费| 欧美激情久久久久久| 亚洲精品18在线观看| 麻豆精品新av中文字幕| 午夜不卡福利视频| 精品少妇一二三区| 日本一区二区三区在线观看| 欧美少妇另类| 亚洲成av人片一区二区密柚| 在线观看男女av免费网址| 国产精品久久久久aaaa樱花| 亚洲欧美日本一区二区三区| 91色中文字幕| 91亚洲国产成人精品一区二三| 欧美gay囗交囗交| 国产欧美三级| 欧美一区二区成人| 日本午夜精品| 中文字幕日韩经典| 亚洲成人av一区二区三区| 欧美日韩性视频在线| japanesexxxxfree在线观看| 国产精品福利电影| 在线欧美激情| a视频免费看|