*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 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)异常处理方式,如果你不知道,那赶快回去补课,推荐的书是罗云彬的<Win32环境下的汇编语言>第二版,讲的太好了,感谢他。
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后面的也会输出来。
好了,我就写这么多吧,具体就看大家怎么方便怎么用。文中难免有纰漏,请大家包涵,代码是经过验证的,肯定没有错。
谢谢捧场!