您的位置:首页 > 编程语言 > C语言/C++

确切定位c++代码中异常抛出位置的两个方法 (以VS2010调试为例)

2011-09-17 11:15 465 查看
有时候程序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在哪里:

在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)
将保护f2()的try--catch暂时去除(一般去除的是真正处理exception的那个try---catch,而不是中间过程的那些try---catch,因为中间过程很多的try---catch可能仅仅是把catch到exception重新throw到外层,而不是真正处理),然后F5,程序也会stop在f()中 “throw new Test(6);”这一行。

实际项目可以灵活应用这两个方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: