C++ 中try finally症結字詳解。本站提示廣大學習愛好者:(C++ 中try finally症結字詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 中try finally症結字詳解正文
try-finally語句是Microsoft對C和C++說話的擴大,它能使32位的目的法式在異常湧現時,有用包管一些資本可以或許被實時消除,這些資本的消除義務可以包含例如內存的釋放,文件的封閉,文件句柄的釋放等等。try-finally語句特殊合適如許的情形下應用,例如一個例程(函數)中,有幾個處所須要檢測一個毛病,而且在毛病湧現時,函數能夠提早前往。
#include <windows.h>
#include <stdio.h>
try-finally語句的語法與try-except很相似,稍有分歧的是,__finally前面沒有一個表達式,這是由於try- finally語句的感化不是用於異常處置,所以它不須要一個表達式來斷定以後異常毛病的品種。別的,與try-except語句相似,try- finally也能夠是多層嵌套的,而且一個函數內可以有多個try-finally語句,不論它是嵌套的,或是平行的。固然,try-finally多層嵌套也能夠是跨函數的。這裡紛歧一列出示例,年夜家可以本身測試一番。
別的,關於下面示例法式的運轉成果,是否是認為有點料想以外呢?由於 __finally塊中的put(“__finally塊中”)語句也被履行了。是的,沒錯!這就是try-finally語句最具有魔幻才能的處所,即 “不論在何種情形下,在分開以後的感化域時,finally塊區域內的代碼都將會被履行到”。呵呵!這切實其實是很凶猛吧!為了驗證這條規矩,上面來看一個更典范示例,代碼以下:
#include <stdio.h> void main() { puts(“hello”); __try { puts(“__try塊中”); // 留意,上面return語句直接讓函數前往了 return; } __finally { puts(“__finally塊中”); } puts(“world”); } 下面的法式運轉成果以下: hello __try塊中 __finally塊中 Press any key to continue void main() { puts(“hello”); __try { puts(“__try塊中”); } // 留意,這裡不是__except塊,而是__finally代替 __finally { puts(“__finally塊中”); } puts(“world”); }
下面的法式運轉成果以下:
hello
__try塊中
__finally塊中
world
Press any key to continue
總結__finally塊被履行的流程時,無外乎三種情形。第一種就是次序履行到__finally塊區域內的代碼,這類情形很簡略,輕易懂得;第二種就是goto語句或return語句激發的法式掌握流浪開以後__try塊感化域時,體系主動完成對__finally塊代碼的挪用;第三種就是因為在__try塊中湧現異常時,招致法式掌握流浪開以後__try塊感化域,這類情形下也是由體系主動完成對__finally塊的挪用。不管是第 2種,照樣第3種情形,毫無疑問,它們都邑惹起很年夜的體系開支,編譯器在編譯此類法式代碼時,它會為這兩種情形預備許多的額定代碼。普通第2種情形,被稱為“部分睜開(LocalUnwinding)”;第3種情形,被稱為“全局睜開(GlobalUnwinding)”。在前面論述SEH完成的時刻會具體剖析到這一點。
第3種情形,也即因為湧現異常而招致的“全局睜開”,關於法式員而言,這或許是沒法防止的,由於你在應用異常處置機制進步法式靠得住硬朗性的同時,弗成防止的會惹起機能上其它的一些開支。呵呵!這世界其實也算瞞公正的,有得必有掉。
然則,關於第2種情形,法式員完整可以有用地防止它,防止“部分睜開”惹起的不用要的額定開支。現實這也是與構造化法式設計思惟相分歧的,也即一個法式模塊應當只要一個進口和一個出口,法式模塊內盡可能防止應用goto語句等。然則,話雖如斯,有時為了進步法式的可讀性,法式員在編寫代碼時,有時能夠不能不采取一些與構造化法式設計思惟相悖的做法,例如,在一個函數中,能夠有多處的return語句。針對這類情形,SEH供給了一種異常有用的調和計劃,那就是__leave症結字所起的感化,它既具有像goto語句和return語句那樣相似的感化(因為檢測到某個法式運轉中的毛病,須要立時分開以後的 __try塊感化域),然則又防止了“部分睜開” 的額定開支。照樣看個例子吧!代碼以下:
#include <stdio.h> void test() { puts(“hello”); __try { int* p; puts(“__try塊中”); // 直接跳出以後的__try感化域 __leave; p = 0; *p = 25; } __finally { // 這裡會被履行嗎?固然 puts(“__finally塊中”); } puts(“world”); } void main() { __try { test(); } __except(1) { puts(“__except塊中”); } }
下面的法式運轉成果以下:
hello
__try塊中
__finally塊中
world
Press any key to continue
以上所述是小編給年夜家引見的C++ 中try finally症結字的相干常識,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!