try catch 无法捕获有dynamic_cast操作产生的异常

zb2003 2008-04-17 03:19:57
我的目的是捕获dynamic_cast操作失败时产生的异常,但是如何配置vc中的选项才能捕获到呢。我在网上查资料,有人说,把/GX 改成 /eha 就可以了,但是经过实验,我发现改成 /eha 后可以捕获了,但是再改成/GX还能捕获到,为什么开始就捕获不到呢,是不是各个选项的顺序也有要求。
上面是我说的一个测试用的工程,有时候能捕获到,有时候不能捕获到,但是在我另外一个实际的工程中,不论怎么设置选项都不能捕获。(enable exception handling选不选都不行)

到底怎么组合各个vc选项才能捕获到异常呢?
只有60分了,不好意思啊:)

测试工程代码如下(实际工程原理和这个相同):
class TestBase
{
private:
int a;
public:
int virtual getA();
};

class TestSub : public TestBase
{
private:
int b;
public:
int getA();
};
int TestBase::getA()
{
return 4;
}
int TestSub::getA()
{
b = 1;
return b;
}

void CMainFrame::OnTest()
{
// TODO: Add your command handler code here
TestSub * subA = new TestSub;
TestSub * subB = subA;

delete subA;
try
{
TestSub * subC = dynamic_cast<TestSub *>(subB);
}
catch(...)
{
AfxMessageBox("hello");//我所说的捕获不到异常,是指这里面的代码没有执行
subB = NULL;
}
if(subB != NULL)
{
int a = subB->getA();
}
}
...全文
182 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
zb2003 2008-04-17
to lemon_wei

将optimizations选项设置成disable在测试工程下就可以捕获异常,但是在我的另外一个工程中就不能,这又是什么原因呢?
回复
lemon_wei 2008-04-17
只在debug版时会catch住, release时就不行了
回复
zb2003 2008-04-17
to lemon_wei

那为什么catch里面的代码运行了,难道不是dynamic_cast抛出的异常,是别的东西抛出来的,请指教:)
回复
lemon_wei 2008-04-17
dynamic_cast 进行指针转换时是不会抛异常的,返回值为空就说明是转换失败了。
dynamic_cast 进行引用转换时才会抛异常
回复
zb2003 2008-04-17
另外,把下面两行注释掉,还是会抛出异常,有点晕了:)
//delete subA;
//subA = NULL;

关于这个问题,是我的一个失误,刚才不小心把enable rtti关了
回复
zb2003 2008-04-17
另外,把下面两行注释掉,还是会抛出异常,有点晕了:)
//delete subA;
//subA = NULL;
回复
zb2003 2008-04-17
我刚刚又测试了一下,即使在上面代码中
delete subA;
后面加上
subA = NULL;
也会抛出异常,这时subB和subC都成传说中的野指针了
回复
zb2003 2008-04-17
只判断subC != NULL有的时候是不够的,因为有时subB在其他地方被delete掉了,而且没有subB = NULL;操作
回复
ostrich2fly 2008-04-17
学习
回复
zb2003 2008-04-17
另外,改成如下形式也不行
__try
{}
__except(1)
{}
回复
yusheng9966 2008-04-17
我没试过异常。一般判断subC != NULL
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-17 03:19
社区公告

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