程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ 中try finally症結字詳解

C++ 中try finally症結字詳解

編輯:關於C++

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症結字的相干常識,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved