博客日历
2025年07月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
30 | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | 1 | 2 | 3 |
存档
2025年03月 2024年
03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
在C++中捕获未曾意料的异常
在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++) 异常的异常处理模型。
参见:
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。
当然,还可以使用Windows的SEH异常处理结构(不需要/EHa 选项):
int *p=NULL;
__try
{
*p=100;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
printf("an error has been occured.\n");
}
注意:在使用具有析构函数的对象的函数中,不应使用结构化异常处理。如果出现异常,则无法调用析构函数。
上一篇: C++的static关键字全面解析
下一篇: STL中的迭代器使用
分类:Win32/C++ 查看次数:8287 发布时间:2009/6/26 17:31:08