有时候程序crash了,但是不能定位具体的exception在哪里throw的(因为可能函数调用很深,并且有很多try--catch),举个简单的例子:

class Test
{
public:
Test(int i) : m_i(i) {}
void f()
{
cout << m_i << endl;
throw new Test(6);
}
private:
int m_i;
};
void f1()
{
try
{
Test* pT = new Test(0);
pT->f();
}
catch (...)
{
cout << "exception is caught in f1!" << endl;
throw;
}
}

void f2()
{
try
{
f1();
}
catch (...)
{
cout << "exception is caught in f2!" << endl;
throw;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
try
{
f2();
}
catch (...)
{
cout << "exception is caught in main!" << endl;
}

        return 0;

}

因为你一开始可能并不知道在哪里设breakpoints,所以F5以后,程序会直接stop到main()函数的最后一行,还是查不出具体的问题在哪里。有下面两个方法可以定位exception在哪里:

  1. 在VS的菜单Debug--->Exceptions中把一些exceptions打上勾(default一般都不勾),在上面这个特殊例子中,因为我throw了一个自己定义的exception类Test,所以需要把Test这个exception加入到Exceptions dialog中去(click "Add", 在New Exceptions dialog中Name设为"Test",就可以加入了,然后在Exceptions dialog中把Test这个exception勾上)。此时直接F5,程序会stop在f()中 “throw new Test(6);”这一行。(实际项目中根据实际情况,勾选相应的exceptions,如果全勾上,比较保险,但是会有很多不必要的exception会stop下来,根据经验,一般c++ project中,我只勾选Win32 Exceptions,如果不行,再勾选一些别的exceptions)
  2. 将保护f2()的try--catch暂时去除(一般去除的是真正处理exception的那个try---catch,而不是中间过程的那些try---catch,因为中间过程很多的try---catch可能仅仅是把catch到exception重新throw到外层,而不是真正处理),然后F5,程序也会stop在f()中 “throw new Test(6);”这一行。
实际项目可以灵活应用这两个方法。

posted on 2011-09-17 11:15  chuwachen  阅读(1380)  评论(0编辑  收藏  举报