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\n", function, file, line);
 wprintf(L"Expression: %s\n", 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不抛出异常,那程序会往下执行,那么可能会发生更糟糕的情况。因此,建议抛出异常,中止执行后续的代码。

_set_invalid_parameter_handler异常处理函数的更多相关文章

  1. PHP异常处理函数set_exception_handler()的用法

    定义和用法 set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 nul ...

  2. 内存保护机制及绕过方案——通过覆盖SEH异常处理函数绕过/GS机制

    通过SEH链绕过GS保护机制 ⑴.  原理分析: i.异常处理结构(SEH)处理流程如下: SEH是基于线程的,每一个线程都有一个独立的SEH处理结果,在线程信息块中的第一个结构指向线程的异常列表,F ...

  3. c++异常处理函数

    注意: throw 抛出异常,catch 捕获异常,try 尝试捕获异常 catch 中的参数类型要和throw 抛出的数据类型一致 try{    //可能抛出异常的语句}catch (异常类型1) ...

  4. python 异常处理函数--raise

    Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...

  5. PHP set_exception_handler 设置异常处理函数

    If you're handling sensitive data and you don't want exceptions logging details such as variable con ...

  6. js中的自定义异常处理函数

    1. Can I suppress JavaScript error messages? 2. Can I set up my own JavaScript error handler? 3. Can ...

  7. php设定错误和异常处理可使用的函数

    1.register_shutdown_function 使用场景:当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,这个函数会被调用. 函数介绍: void register_shutdown ...

  8. 异常处理与MiniDump详解(4) MiniDump

    http://blog.csdn.net/vagrxie/article/details/4398721 异常处理与MiniDump详解(4) MiniDump 分类:             [Wi ...

  9. 异常处理与MiniDump详解(转)

    一.   综述 总算讲到MiniDump了. Dump有多有用我都无法尽数,基本上属于定位错误修复BUG的倚天剑.(日志可以算是屠龙刀)这些都是对于那些不是必出的BUG,放在外面运行的时候出现的BUG ...

随机推荐

  1. paip.提升效率---提升绑定层次--form绑定取代field绑定

    paip.提升效率---提升绑定层次--form绑定取代field绑定 =================== 编辑form中,常常需要,绑定一个对象到个form..   传统上要绑定field开始. ...

  2. android 给空白包签名

    前言:之前公司app在腾讯开放平台认领应用时,涉及了一个问题:就是给空白包签名.然后再上传上去审核. 腾讯开放平台的官方说明如下, 如何签名:jarsgner-verbose-keystore[key ...

  3. Leetcode 292 Nim Game 博弈论

    class Solution {public:    bool canWinNim(int n) {        return n % 4 != 0;    }};

  4. 转:SDL2源代码分析

    1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中 ...

  5. nodejs express 框架解密5-视图

    本文档是基于express 3.4.6 的 在我们的代码中,渲染模板大致是这样写的 exports.index = function(req, res){ res.render('index', { ...

  6. GridView第一个Item中的CheckBox不工作

    问题:如题 解决办法: 修改后: ViewGroup.LayoutParams params =helper.getConvertView().getLayoutParams(); params.wi ...

  7. Web - 客户端存储的几种方式

    客户端存储主要方便一些APP离线使用.今天就来说说客户端存储的方法有多少? 说在最前面的一句:所有的客户端存储都有一个原则:读写的数据必须要同域 1 Cookie Cookie是一项很老的技术的,就是 ...

  8. VC 2010的重大变化

    auto 关键字具有新的默认含义.由于使用旧含义的情况很少见,因此大多数应用程序都不会受此更改影响. 引入了新的 static_assert 关键字,如果代码中已经存在具有某个名称的标识符,则此关键字 ...

  9. Struts2的属性驱动与模型驱动的区别

    1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...

  10. 阿里云centos试用

    今天体验了下阿里云的centos,起初用的官方推荐的putty方式来管理,全部使用命令行管理起来还是很别扭的. 后来通过百度了解到winscp,有了这个工具,管理起来就爽很多啦.整个centos的管理 ...