_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不抛出异常,那程序会往下执行,那么可能会发生更糟糕的情况。因此,建议抛出异常,中止执行后续的代码。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!