我的目的是捕获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();
}
}

解决方案 »

  1.   

    我没试过异常。一般判断subC != NULL
      

  2.   

    另外,改成如下形式也不行
    __try
    {}
    __except(1)
    {}
      

  3.   

    只判断subC != NULL有的时候是不够的,因为有时subB在其他地方被delete掉了,而且没有subB = NULL;操作
      

  4.   

    我刚刚又测试了一下,即使在上面代码中
    delete subA;
    后面加上
    subA = NULL;
    也会抛出异常,这时subB和subC都成传说中的野指针了
      

  5.   

    另外,把下面两行注释掉,还是会抛出异常,有点晕了:)
    //delete subA;
    //subA = NULL;
      

  6.   

    另外,把下面两行注释掉,还是会抛出异常,有点晕了:) 
    //delete subA; 
    //subA = NULL;关于这个问题,是我的一个失误,刚才不小心把enable rtti关了
      

  7.   

    dynamic_cast 进行指针转换时是不会抛异常的,返回值为空就说明是转换失败了。
    dynamic_cast 进行引用转换时才会抛异常
      

  8.   

    to lemon_wei那为什么catch里面的代码运行了,难道不是dynamic_cast抛出的异常,是别的东西抛出来的,请指教:)
      

  9.   

    只在debug版时会catch住, release时就不行了
      

  10.   

    to lemon_wei将optimizations选项设置成disable在测试工程下就可以捕获异常,但是在我的另外一个工程中就不能,这又是什么原因呢?