qintangtao

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

//结构化异常处理(try-except块)

__try
{
}
__except(filter_value)
{
}


在被__try{}包围的块中,如果出现异常,会根据filter_value的数值,判断是否需要在
__except{}块中处理。filter_value的数值会有三种可能。

(1)EXCEPTION_EXECUTE_HANDLER,该数值为1。进入到__except进行错误处理,处理完后
不再回到__try{}块中,转而继续执行
(2)EXCEPTION_CONTINUE_SEARCH,该数值为0。不使用__except块中的异常处理,转而向
上一层回卷。如果已经是最外层,则向操作系统请求异常处理函数
(2)EXCEPTION_CONTINUE_EXECUTION,该数值为-1。重复先前错误的指令,之歌在驱动程
序中很好用到

/************************************************************************
* 函数名称:ProbeTest
* 功能描述:ProbeForRead和ProbeForWrite函数可以和try-except块配合,
        用来检查某段内存是否可读写
* 参数列表:
* 返回 值:VOID
*************************************************************************/
VOID ProbeTest()
{
    PVOID badPointer = NULL;
    KdPrint(("Enter ProbeTest\n"));

    __try
    {
        KdPrint(("Enter __try block\n"));

        //判断空指针是否可写,显示会导致异常
        ProbeForWrite(badPointer, 100, 4);

        //由于在上面引发异常,所以以后语句不会被执行!
        KdPrint(("Leave __try block\n"));
    }
    __except
    {
        KdPrint(("Catch the except\n"));
        KdPrint(("The program will keep going\n"));
    }
    //该语句会被执行
    KdPrint(("Leave ProbeTest\n"));
}
//触发异常函数
函数                                描述
ExRaiseStatus                      //用指定状态代码触发异常
ExRaiseAccessViolation             //触发STATUS_ACCESS_VIOLATION异常
ExRaiseDatatypeMisalignment        //触发STATUS_DATATYPE_MISALIGNMENT异常
//结构化异常处理(try-finally块)
/************************************************************************
* 函数名称:TryFinallyTest
* 功能描述:结构化异常处理的另一种使用方法,利用try_finally块,
        强迫函数在退出前执行一段代码
* 参数列表:
* 返回 值:VOID
*************************************************************************/
NTSTATUS TryFinallyTest()
{
    NTSTATUS status = STATUS_SUCCESS;
    __try
    {
        //做一些事情
        return STATUS_SUCCESS;
    }
    __finally
    {
        //程序退出前必然运行到此
        KdPrint(("Enter finaly block\n"));
    }
}

在上面代码的__try{}块中,无论运行什么代码(即使是return语句或者触发异常),
在程序退出前都会运行__finally{}块中的代码。这样的目的是,在退出前需要运行
一些资源回收的工作,而资源回收的代码的最佳位置就是放在这个块中

/************************************************************************
* 函数名称:FoolTest
* 功能描述:使用try-finally块还可以某种程度上简化代码
* 参数列表:
* 返回 值:VOID
*************************************************************************/
VOID FoolTest()
{
    NTSTATUS status = STATUS_SUCCESS;
    //执行操作1
    status = Foo1(...);
    //判断操作是否成功
    if(!NT_SUCCESS(status))
    {
        //回收资源
        return status;
    }

    //执行操作2
    status = Foo2(...);
    //判断操作是否成功
    if(!NT_SUCCESS(status))
    {
        //回收资源
        return status;
    }

    //执行操作n
    status = FooN(...);
    //判断操作是否成功
    if(!NT_SUCCESS(status))
    {
        //回收资源
        return status;
    }

    //返回状态,此状态一般是STATUS_SUCCESS
    return status;
}
VOID FooTest()
{
    NTSTATUS status = STATUS_SUCCESS;

    __try
    {
        //执行操作1
        status = Foo1(...);
        //判断操作是否成功
        if(!NT_SUCCESS(status))
        {
            return status;
        }

        //执行操作2
        status = Foo2(...);
        //判断操作是否成功
        if(!NT_SUCCESS(status))
        {
            return status;
        }

        //执行操作n
        status = FooN(...);
        //判断操作是否成功
        if(!NT_SUCCESS(status))
        {
            return status;
        }
    }
    __finally
    {
        if(!NT_SUCCESS(status))
        {
            //回收资源    
        }
        return status;
    }
}

 

 

 

 

 

 

 

posted on 2013-04-14 21:24  qintangtao  阅读(1481)  评论(0)    收藏  举报