[原创]vc 6中的结构化异常处理try-except-finally语句 - VC 论坛 - C 论坛 - 编程论坛

来源:百度文库 编辑:神马文学网 时间:2024/04/25 00:27:38

[原创]vc++6中的结构化异常处理try-except-finally语句

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: misssir E-mail:yzp3646@163.com QQ:13633292
*/ 时间: 2007-8-31 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


vc++6中的结构化异常处理try-except-finally语句
本文主要阐述我对Microsoft Visual C++ 6.0中异常处理的理解

我想首先应该很清楚Windows中的SEH(结构化异常处理 structure exception handle)异常处理方式,如果你不知道,那赶快回去补课,推荐的书是罗云彬的第二版,讲的太好了,感谢他。

VC6中的语法是:

(1) try-except
-----------------------------
__try
{
...
}
__except(...)
{
...
}
-----------------------------

(2) try-finally
-----------------------------
__try
{
...
}
__finally
{
...
}
-----------------------------

相信很多人和我一样,对两个下划线开头感觉很不舒服。原因嘛就是:标准C中并没有try-except-finally语句,标准C建议编译器自己扩充的关键字最好用__开头,所以我们就看到了__try、__except、__finally。

那么VC中不带下划线的try-catch-throw是干什么用的呢,管它什么鸟用呢,我现在反正没用,好像和java中的try语句作用差不多吧,都是程序自己定义个异常类型,找个地方来处理。而__try语句处理的是操作系统甩给它的异常编号。

MSDN上说,对于处理不容易重现的间歇性问题特别有用。也就是说,它应该用在if语句不太管用的地方。

一个简单的示例代码
-------------------------------------------------
char* p1;
char* p2 = "abc\n";
__try
{
strcpy(p1, p2);
printf("in __try\n");
}
__except(1) // EXCEPTION_EXECUTE_HANDLER = 1
{
printf("in __except\n");
printf(p2);
}
printf("after __except\n");
-------------------------------------------------

编译时会有一个警告:
warning C4700: local variable 'p1' used without having been initialized.

执行的结果是:
-----------------------------
in __except
abc
after __except
-----------------------------

看,这是多么简单呀,顺便说明一下__except括号中的值,必须是以下三个:

EXCEPTION_CONTINUE_EXECUTION (–1) 忽略异常,继续在发生异常的地方执行。
EXCEPTION_CONTINUE_SEARCH (0) 异常不在这里处理,在SEH链中查找下一个处理器。
EXCEPTION_EXECUTE_HANDLER (1) 在__except中执行,然后在__except后面执行。

SEH链知道是什么意思吗,不知道就看书去。下一个处理器应该就是现在这个try语句外层的try-except

再一个简单的示例代码
-------------------------------------------------
char* p1;
char* p2 = "abc\n";
__try
{
__try
{
strcpy(p1, p2);
printf("in __try\n");
}
__except(1)
{
printf("in __except\n");
}
printf("after __except\n");
}
__finally
{
printf("in __finally\n");
}
printf("after __finally\n");
-------------------------------------------------
执行的结果是:
-----------------------------
in __except
after __except
in __finally
after __finally
-----------------------------

再再一个简单的示例代码
-------------------------------------------------
char* p1;
char* p2 = "abc\n";
__try
{
__try
{
strcpy(p1, p2);
printf("in __try\n");
}
__finally
{
printf("in __finally\n");
}
printf("after __finally\n");
}
__except(1)
{
printf("in __except\n");
}
printf("after __except\n");
-------------------------------------------------
执行的结果是:
-----------------------------
in __finally
in __except
after __except
-----------------------------

再再再一个简单的示例代码
-------------------------------------------------
char* p1;
char* p2 = "abc\n";
__try
{
strcpy(p1, p2);
printf("in __try\n");
}
__finally
{
printf("in __finally\n");
}
printf("after __finally\n");
-------------------------------------------------
执行的结果是:xxx.exe遇到问题需要关闭,还要发送错误报告给微软。然后输出一条
"in __finally",就这一句,别以为__finally后面的也会输出来。

好了,我就写这么多吧,具体就看大家怎么方便怎么用。文中难免有纰漏,请大家包涵,代码是经过验证的,肯定没有错。