WEB开发网
开发学院软件开发VC Visual C++中的结构异常处理 阅读

Visual C++中的结构异常处理

 2010-05-25 20:36:09 来源:WEB开发网   
核心提示:2.2.3、例3--Funcenstein3现在让我们对Funcenstein2做进一步改动,看看会出现什么情况(见例3),Visual C++中的结构异常处理(3),DWORD Funcenstein3(void) {DWORD dwTemp;// 1. Do any processing here....__try

2.2.3、例3--Funcenstein3

现在让我们对Funcenstein2做进一步改动,看看会出现什么情况(见例3)。

DWORD Funcenstein3(void) {
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);

例3 Funcenstein3函数代码

在函数Funcenstein3中,当遇到goto语句时编译器会产生额外的代码以保证finally程序段内的代码得到执行。但是,这一次finally程序段后ReturnValue标签后面的代码会被执行,因为try或finally程序段内没有返回语句。函数的返回值是5。同样,由于goto语句打断了从try程序段到finally程序段的自然流程,程序的效率会降低。

2.2.4、例4--Funcfurter1

现在让我们来看中断处理真正展现其功能的一个例子。(见例4)。

DWORD Funcfurter1(void) {
DWORD dwTemp;
// 1. Do any processing here.
.
.
.
__try {
// 2. request permission to access protected data, and then use it.
WaitForSingleObject(g_hSem, INFINITE);
dwTemp = Funcinator(g_dwProtectedData);

__finally {
// 3. Allow others to use protected data.
ReleaseSemaphore(g_hSem, 1, NULL);

// 4. Continue processing.
return (dwTemp);

例4 Funcfurter1函数代码

设想try程序段内调用的Funcinator函数具有某种缺陷而造成无效内存读写。在16位视窗应用程序中,这会导致一个已定义好的错误信息对话框出现。在用户关闭对话框的同时该应用程序也终止运行。在不具有try-finally的Win32应用程序中,这会导致程序终止运行,指示灯信号永远不会得到释放。这就造成了等待该指示灯信号的其它线程会永远等待下去。而将ReleaseSemaphore放在finally程序段内则从根本上保证了不论何种情况出现指示灯信号都会得到释放。

如果中断处理句柄能够处理由于无效内存读写而造成的程序中断,我们就完全有理由相信它能够处理诸如setjump/longjump、break和continue这类的中断转移。事实也正是这样。

上一页  1 2 3 4  下一页

Tags:

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接