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

时间:2022-12-15 13:31:12

原帖及讨论:http://bbs.bc-cn.net/dispbbs.asp?boardID=55&ID=166791

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国  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中异常处理的理解

我想首先应该非常清晰视窗系统中的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语句处理的是OS甩给他的异常编号。

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后面的也会输出来。

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

谢谢捧场!