我的博客小站

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

posted on 2014-09-22 16:38  BIGSING  阅读(1614)  评论(0编辑  收藏  举报

导航

我的博客小站