• _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不抛出异常,那程序会往下执行,那么可能会发生更糟糕的情况。因此,建议抛出异常,中止执行后续的代码。

  • 相关阅读:
    TypeConverter的使用
    ASP.NET MVC——Controller的激活
    ASP.NET 会话状态的模式
    ASP.NET页面生命周期描述
    一个字符串搜索的Aho-Corasick算法
    ILMerge 简单使用
    js css优化-- 合并和压缩
    C#.Net网页加载等待效果漂亮并且简单
    获取打开文件的路径和文件名
    C#程序中:如何启用进程、结束进程、查找进程
  • 原文地址:https://www.cnblogs.com/daxingxing/p/3986262.html
Copyright © 2020-2023  润新知