在C++中,可以使用C++的标准异常处理:

int *p=NULL;
try
{
    *p=100;
}
catch(...)
{
    printf("an error has been occured.\n");
}

但是这样的try..catch结构只有在Debug模式下有效,Release模式下无法捕获,Google后发现是因为VC++编译器的优化功能造成的,编译时加入/EHa 选项(异常处理模型)即可正常使用。
参见:
http://www.doyj.com/2006/09/11/try-catch/
http://members.cox.net/doug_web/eh.htm
http://msdn.microsoft.com/zh-cn/express/1deeycx5.aspx 权威。

选项的格式:/EH{s|a}[c][-]
a: 捕获异步(结构化)异常和同步 (C++) 异常的异常处理模型。
s: 仅捕获 C++ 异常并通知编译器假定 extern C 函数确实引发了异常的异常处理模型。
c: 如果与 s (/EHsc) 一起使用,则仅捕获 C++ 异常并通知编译器假定 extern C 函数从未引发 C++ 异常。/EHca 等效于 /EHa。
可以使用符号 "-" 清除选项。例如,/EHsc- 解释为 /EHs /EHc- 并且等价于 /EHs。
 
当然,还可以使用WindowsSEH异常处理结构(不需要/EHa 选项):

int *p=NULL;
__try
{
    *p=100;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
    printf("an error has been occured.\n");
}
 
注意:在使用具有析构函数的对象的函数中,不应使用结构化异常处理。如果出现异常,则无法调用析构函数。

 


本文链接地址: 在C++中捕获未曾意料的异常
https://blog.qingfengju.com/index.asp?id=94

上一篇: C++的static关键字全面解析
下一篇: STL中的迭代器使用

分类:Win32/C++ 查看次数:8287 发布时间:2009/6/26 17:31:08