VS2005以后的版本,微软增长了一些新的异常机制,新机制在出现错误时默认不通知应用程序,这时程序就崩溃了。
因此这种状况下,必须调用_set_invalid_parameter_handler、_set_purecall_handler设置本身的异常处理函数。express
如下示例代码:函数
// test.cpp
// compile with: /Zi /MTd
// C++ Exceptions : /EHaui
#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;
}orm
int main()
{
char* formatString;
_invalid_parameter_handler oldHandler;
_purecall_handler old_pure_handle;get
oldHandler = _set_invalid_parameter_handler(myInvalidParameterHandler);
old_pure_handle = _set_purecall_handler(myPurecallHandler);it
try
{
formatString = NULL;
printf(formatString); // 发生异常
}
catch(...)
{
// 定位错误位置,输出log
printf("catch");
}io
getchar();
}function
说明:
一、因为formatString是空指针,printf(formatString)发生异常,这时CRT会调用myInvalidParameterHandler进行处理;
二、myInvalidParameterHandler抛出异常。注意,function、file、line在Release下无效,因此必须抛出异常,不然没法定位错误代码;
三、设置工程选项C++ Exceptions : /EHa,让catch抓住myInvalidParameterHandler抛出的异常,再作相应的处理;form
注意:若是myInvalidParameterHandler不抛出异常,那程序会往下执行,那么可能会发生更糟糕的状况。所以,建议抛出异常,停止执行后续的代码。