对于异常处理以及优化方面的疑惑

leftbackfielder 2013-06-05 05:23:19
try
{
int *p = NULL;
int a = *p;

int b = 100;
int c= b/0;

delete p;
//throw(1);

AfxMessageBox(L"do not catched");

}
catch(...)
{
AfxMessageBox(L"catched");
}

我用的是VS2005, 如果工程的编译选项都在默认的情况下.上面的代码,在DEBUG下,可以catch到异常.在Release下面,catch不到.
在网上查了一些资料,说是有一个/EHA的选项.加上这个选项之后,Release下面,依然无法catch到异常.
如果在release下,去掉优化选项,这样才可以catch到异常.
是编译器把异常处理优化掉了吗?
那加这些异常处理还有什么意义呢?一定要throw才,可以catch吗?
...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leftbackfielder 2013-06-07
  • 打赏
  • 举报
回复
引用 9 楼 akirya 的回复:
[quote=引用 6 楼 leftbackfielder 的回复:] [quote=引用 5 楼 akirya 的回复:] try只保证throw的异常。 除0,访问空指针 得用 __try 才能捕获

__try
	{
		int *p = NULL;
		int a = *p;

		int b = 100;
		int c= b/0;

		delete p;
		//throw(1);

		AfxMessageBox(L"do not catched");
		
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		AfxMessageBox(L"catched");
	}
这样也没有捕获到.什么原因呢?[/quote] 中间的代码被优化掉了,改一下,数据有程序读入。[/quote] 改成成员变量,就可以捕获到了..囧.
无言猪 2013-06-06
  • 打赏
  • 举报
回复
是你try里面的语句,编译器发现这一段没有任何意义,直接给你优化掉了.
Saleayas 2013-06-06
  • 打赏
  • 举报
回复
加上一句打印 c
leftbackfielder 2013-06-06
  • 打赏
  • 举报
回复
引用 1 楼 xiaoc1026 的回复:
Release 下 有些语句被优化不执行,所以捕获不到,不是不能捕获,你搞个数据越界的,肯定可以捕获到了。
被优化不执行?是try,catch被优化掉了?上面的那个代码,明显就是有BUG的..
无言猪 2013-06-06
  • 打赏
  • 举报
回复
引用 7 楼 leftbackfielder 的回复:
[quote=引用 4 楼 lostying 的回复:] 是你try里面的语句,编译器发现这一段没有任何意义,直接给你优化掉了.
是优化掉try里面的代码,还是把try给优化掉了?[/quote] try里面的代码,又没输入没输出的,除了一个delete p可能不被优化掉,其他的都是栈上的操作,而且不传递给别的地方使用,直接优化了.你编译release版本时把优化全部去掉就行了.项目属性->C++->优化->禁用
  • 打赏
  • 举报
回复
引用 6 楼 leftbackfielder 的回复:
[quote=引用 5 楼 akirya 的回复:] try只保证throw的异常。 除0,访问空指针 得用 __try 才能捕获

__try
	{
		int *p = NULL;
		int a = *p;

		int b = 100;
		int c= b/0;

		delete p;
		//throw(1);

		AfxMessageBox(L"do not catched");
		
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		AfxMessageBox(L"catched");
	}
这样也没有捕获到.什么原因呢?[/quote] 中间的代码被优化掉了,改一下,数据有程序读入。
leftbackfielder 2013-06-06
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
加上一句打印 c
没太懂您的意思.加什么打印?
leftbackfielder 2013-06-06
  • 打赏
  • 举报
回复
引用 4 楼 lostying 的回复:
是你try里面的语句,编译器发现这一段没有任何意义,直接给你优化掉了.
是优化掉try里面的代码,还是把try给优化掉了?
leftbackfielder 2013-06-06
  • 打赏
  • 举报
回复
引用 5 楼 akirya 的回复:
try只保证throw的异常。 除0,访问空指针 得用 __try 才能捕获

__try
	{
		int *p = NULL;
		int a = *p;

		int b = 100;
		int c= b/0;

		delete p;
		//throw(1);

		AfxMessageBox(L"do not catched");
		
	}
	__except( EXCEPTION_EXECUTE_HANDLER )
	{
		AfxMessageBox(L"catched");
	}
这样也没有捕获到.什么原因呢?
  • 打赏
  • 举报
回复
try只保证throw的异常。 除0,访问空指针 得用 __try 才能捕获
见习学术士 2013-06-05
  • 打赏
  • 举报
回复
Release 下 有些语句被优化不执行,所以捕获不到,不是不能捕获,你搞个数据越界的,肯定可以捕获到了。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧