VC异常.简单抛,简单捕获

1、ZC:始终没有找到,能像Delphi7里面那样能抛 字符串描述 的异常信息。(难道Delphi是这样做的?:在程序的最外围 套了一层异常捕获,然后在获取到异常之后,自己再将异常信息弹出来,我们写的字符串信息 可以通过 _EXCEPTION_RECORD.ExceptionInformation来保存)[ 下面有我的猜测Delphi7中的做法 ]

  ZC:这里就 使用 异常Code 来区分异常吧。本来想使用 0xFFFF???? 来表示 我的异常Code的,但是 实际运行发现 跑出来的异常代码变成了 0xEFFF????,于是改为使用 0xCCCC????,这个看了一下 没有变化...

2、简单 抛异常 WindowsAPI:

RaiseException(
    __in DWORD dwExceptionCode,
    __in DWORD dwExceptionFlags,
    __in DWORD nNumberOfArguments,
    __in_ecount_opt(nNumberOfArguments) CONST ULONG_PTR *lpArguments
    );

  2.1、我的抛异常使用:RaiseException(0xCCCC????, EXCEPTION_NONCONTINUABLE, 0, NULL);

    ZC:第二个参数 如果不是EXCEPTION_NONCONTINUABLE,而是 0 的话  表示(exe)可以继续执行

  2.2、我的捕获异常的使用:

void main()
{
    __try
    {
        RaiseException(0xCCCC0001, EXCEPTION_NONCONTINUABLE, 0, NULL);
    }
    __except( ExceptionFilterZ( "main(...)", GetExceptionCode() ) )
    {
        printf("Catch an exception\n");
    }

    printf("main() out.\n");
    system("pause");
}
long WINAPI ExceptionFilterZ(char* _pcFuncName, DWORD _dwExceptionCode)
{
    //return (_dwExceptionCode == STATUS_STACK_OVERFLOW) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;

    printf_s("==> ==> ==> %s catch exception , _dwExceptionCode : %d(0x%08X)\n",
        _pcFuncName, _dwExceptionCode, _dwExceptionCode);

    return EXCEPTION_EXECUTE_HANDLER;

    //#define STATUS_SEGMENT_NOTIFICATION      ((DWORD   )0x40000005L) 
    //STATUS_STACK_OVERFLOW
}

 

3、我猜 Delphi7中可能是这样做的:

  通过 struct _EXCEPTION_POINTERS 保存程序员输入的 字符串信息,在异常发生时 再将它取出来显示

  3.1、测试代码:

long WINAPI ExceptionFilterFunc(char* _pcFuncName, struct _EXCEPTION_POINTERS *_exception_info)
{
    //return (_dwExceptionCode == STATUS_STACK_OVERFLOW) ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;

    DWORD dwExceptionCode = _exception_info->ExceptionRecord->ExceptionCode;
    printf_s("==> ==> ==> Catch exception !!! Func name :%s, _dwExceptionCode : %d(0x%08X)\n",
        _pcFuncName, dwExceptionCode, dwExceptionCode);

    DWORD dwNumberParameters = _exception_info->ExceptionRecord->NumberParameters;
    printf("\t NumberParameters :%d\n", dwNumberParameters);
    if (dwNumberParameters == 1)
    {
        ULONG_PTR ulp = _exception_info->ExceptionRecord->ExceptionInformation[0];
        char* pc = (char*)ulp;
        printf("\t Information :%s\n", pc);
        delete[] pc;
    }

    return EXCEPTION_EXECUTE_HANDLER;

    //#define STATUS_SEGMENT_NOTIFICATION      ((DWORD   )0x40000005L) 
    //STATUS_STACK_OVERFLOW
}

void main()
{
    __try
    {
        char* pcMsg = "zc test exception msg .";
        char* pc = new char[strlen(pcMsg) + 1];
        pc[strlen(pcMsg)] = '\0';
        memcpy(&pc[0], &pcMsg[0], strlen(pcMsg));
        ULONG_PTR ulps[EXCEPTION_MAXIMUM_PARAMETERS] = {0};
        ulps[0] = (ULONG_PTR)pc;
        RaiseException(0xCCCC0001, EXCEPTION_NONCONTINUABLE, 1, &ulps[0]);

        //GetExceptionInformation     (struct _EXCEPTION_POINTERS *)_exception_info
    }
    __except( ExceptionFilterFunc( "main(...)", GetExceptionInformation() ) )
    {
        printf("Catch an exception\n");
    }

    printf("main() out.\n");
    system("pause");
}

 

4、

5、

 

posted @ 2018-11-01 11:13  CppSkill  阅读(1034)  评论(0编辑  收藏  举报