_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\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异常处理函数的更多相关文章
- PHP异常处理函数set_exception_handler()的用法
定义和用法 set_exception_handler() 函数设置用户自定义的异常处理函数. 该函数用于创建运行时期间的用户自己的异常处理方法. 该函数会返回旧的异常处理程序,若失败,则返回 nul ...
- 内存保护机制及绕过方案——通过覆盖SEH异常处理函数绕过/GS机制
通过SEH链绕过GS保护机制 ⑴. 原理分析: i.异常处理结构(SEH)处理流程如下: SEH是基于线程的,每一个线程都有一个独立的SEH处理结果,在线程信息块中的第一个结构指向线程的异常列表,F ...
- c++异常处理函数
注意: throw 抛出异常,catch 捕获异常,try 尝试捕获异常 catch 中的参数类型要和throw 抛出的数据类型一致 try{ //可能抛出异常的语句}catch (异常类型1) ...
- python 异常处理函数--raise
Python 异常处理--raise函数用法 在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称.异常名称标识出具体的类: Python异常处理是那些类的对象 ...
- PHP set_exception_handler 设置异常处理函数
If you're handling sensitive data and you don't want exceptions logging details such as variable con ...
- js中的自定义异常处理函数
1. Can I suppress JavaScript error messages? 2. Can I set up my own JavaScript error handler? 3. Can ...
- php设定错误和异常处理可使用的函数
1.register_shutdown_function 使用场景:当我们的脚本执行完成或意外死掉导致PHP执行即将关闭时,这个函数会被调用. 函数介绍: void register_shutdown ...
- 异常处理与MiniDump详解(4) MiniDump
http://blog.csdn.net/vagrxie/article/details/4398721 异常处理与MiniDump详解(4) MiniDump 分类: [Wi ...
- 异常处理与MiniDump详解(转)
一. 综述 总算讲到MiniDump了. Dump有多有用我都无法尽数,基本上属于定位错误修复BUG的倚天剑.(日志可以算是屠龙刀)这些都是对于那些不是必出的BUG,放在外面运行的时候出现的BUG ...
随机推荐
- paip.java 以及JavaScript (js) 的关系以及区别
paip.java 以及JavaScript (js) 的关系以及区别 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...
- 《Effective STL中文版》前言
<Effective STL中文版>前言 我第一次写关于STL(Standard Template Library,标准模板库)的介绍是在1995 年,当时我在More Effec ...
- iOS---SQLite数据库框架之FMDB -Swift
SQLite数据库框架之FMDB 什么是FMDB? FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API.对比苹果自带的Core Data框架,更加轻量级 ...
- Java插件开发-取插件下的某个文件
//找到插件所在处 Bundle bundle = Activator.getDefault().getBundle(); //根据插件转义成URL路径 URL url = FileLocator.t ...
- jq滚动监听-导航滚动
github地址:https://github.com/yutaogege/jquery.nav.js 代码: <!DOCTYPE html> <html> <head& ...
- win7给C盘扩容
win7给C盘扩容 需要给C盘在不重装系统的情况下进行扩容.在网上搜索了不少资料,包括使用系统自带的分区工具,PQ等软件,都没有成功.不小心看到了分区助手,使用之,迅速的解决了问题,而且解决的非常完美 ...
- SqlServer2008R2用Windows身份登录18456错误解决
// 重装系统后发现SqlServer2008R2使用Windows身份验证不能进行连接,如下图: 以前经常会碰到SqlServer 身份验证连接失败,Windows身份验证的连接失败还是第一次,试了 ...
- runtime MethodSwizzle 实践之 奇怪crash : [UIKeyboardLayoutStar release]: message sent to deallocated instance
情景: 使用MethodSwizzle 实现对数组.字典 等系统方法的安全校验.显然能达到预期效果,但实际发现当 键盘显示的情况下 home app 进入后台,再单击app 图标 切换回前台时 发 ...
- nginx做反向代理负载均衡 Java怎么获取后端服务器获取用户IP
nginx做反向负载均衡,后端服务器获取真实客户端ip 首先,在前端nginx上需要做如下配置: location / proxy_set_hearder host ...
- Codeforces Round #385 (Div. 2) B - Hongcow Solves A Puzzle 暴力
B - Hongcow Solves A Puzzle 题目连接: http://codeforces.com/contest/745/problem/B Description Hongcow li ...