Visual C++ 中的结构异常处理
2008-11-13 19:29:21 来源:WEB开发网在finally程序段内的代码被执行后,函数Funcenstein2立即返回。这样,因为try程序段内的return返回语句,任何finally程序段后的代码都不会被执行。因而Funcenstein2返回值是5,而不是9。
必须指出的是,当遇到例2中这种过早返回语句时,编译器需要产生额外的代码以保证finally程序段内的代码的执行。此过程称作为局域展开。当然,这必然会降低整个程序的效率。所以,你应该尽量避免使用这类代码。在后面我们会讨论关键词__leave,它可以帮助我们避免编写出现局域展开一类的代码。
2.2.3、例3--Funcenstein3
现在让我们对Funcenstein2做进一步改动,看看会出现什么情况(见例3)。
DWORD Funcenstein3(void) {
例3 Funcenstein3函数代码
DWORD dwTemp;
// 1. Do any processing here.
.
.
.
__try {
// 2. request permission to access protected data, and then use it.
WaitForSingleObject(g_hSem, INFINITE);
g_dwProtectedData = 5;
dwTemp = g_dwProtectedData;
// Try to jump over the finally block.
goto ReturnValue;
}
__finally {
// 3. Allow others to use protected data.
ReleaseSemaphore(g_hSem, 1, NULL);
}
dwTemp = 9;
// 4. Continue processing.
ReturnValue:
return (dwTemp);
}
在函数Funcenstein3中,当遇到goto语句时编译器会产生额外的代码以保证finally程序段内的代码得到执行。但是,这一次finally程序段后ReturnValue标签后面的代码会被执行,因为try或finally程序段内没有返回语句。函数的返回值是5。同样,由于goto语句打断了从try程序段到finally程序段的自然流程,程序的效率会降低。
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››Visual Studio 11全新黑色主题
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››结构体边界对齐
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››Visual C++优化对大型数据集合的并发访问
- ››VISUAL C++中的OCX控件的使用方法
- ››Visual C++实现视频图像处理技术
更多精彩
赞助商链接