zoukankan      html  css  js  c++  java
  • _set_invalid_parameter_handler异常处理函数

    VS2005之后的版本,微软增加了一些新的异常机制,新机制在出现错误时默认不通知应用程序,这时程序就崩溃了。
    所以这种情况下,必须调用_set_invalid_parameter_handler、_set_purecall_handler设置自己的异常处理函数。

    以下示例代码:

    // test.cpp
    // compile with: /Zi /MTd
    // C++ Exceptions : /EHa

    #include <stdio.h>
    #include <stdlib.h>

    void myInvalidParameterHandler(const wchar_t* expression,
              const wchar_t* function, 
              const wchar_t* file, 
              unsigned int line, 
              uintptr_t pReserved)
    {
     // function、file、line在Release下无效
     wprintf(L"Invalid parameter detected in function %s."
      L" File: %s Line: %d ", function, file, line);
     wprintf(L"Expression: %s ", expression);
     // 必须抛出异常,否则无法定位错误位置
     throw 1;
    }
    void myPurecallHandler(void)
    {
     printf("In _purecall_handler.");
     // 必须抛出异常,否则无法定位错误位置
     throw 1;
    }

    int main()
    {
     char* formatString;
     _invalid_parameter_handler oldHandler;
     _purecall_handler old_pure_handle;

     oldHandler = _set_invalid_parameter_handler(myInvalidParameterHandler);
     old_pure_handle = _set_purecall_handler(myPurecallHandler);

     try
     {
      formatString = NULL;
      printf(formatString);  // 发生异常
     }
     catch(...)
     {
      // 定位错误位置,输出log
      printf("catch");
     }

     getchar();
    }

    说明:
    1、由于formatString是空指针,printf(formatString)发生异常,这时CRT会调用myInvalidParameterHandler进行处理;
    2、myInvalidParameterHandler抛出异常。注意,function、file、line在Release下无效,所以必须抛出异常,否则无法定位错误代码;
    3、设置工程选项C++ Exceptions : /EHa,让catch抓住myInvalidParameterHandler抛出的异常,再做相应的处理;

    注意:如果myInvalidParameterHandler不抛出异常,那程序会往下执行,那么可能会发生更糟糕的情况。因此,建议抛出异常,中止执行后续的代码。

  • 相关阅读:
    人月神话阅读笔记之一
    第一阶段冲刺站立会议报告——9
    第一阶段冲刺站立会议报告——8
    第一阶段冲刺站立会议报告——7
    第一阶段冲刺站立会议报告——6
    第一阶段冲刺站立会议报告——5
    第二阶段冲刺第一天
    寻找水王2
    构建之法阅读笔记05
    第十二周学习进度条
  • 原文地址:https://www.cnblogs.com/daxingxing/p/3986262.html
Copyright © 2011-2022 走看看