当前位置:  开发笔记 > 编程语言 > 正文

捕获后在C++中查找异常的来源?

如何解决《捕获后在C++中查找异常的来源?》经验,为你挑选了3个好方法。

我正在寻找MS VC++中的答案.

在调试大型C++应用程序时,遗憾的是它具有非常广泛的C++异常用法.有时我会比实际想要的晚一点捕获异常.

伪代码示例:

FunctionB()
{
    ...
    throw e;
    ...
}

FunctionA()
{
    ...
    FunctionB()
    ...
}

try
{
    Function A()
}
catch(e)
{
    (<--- breakpoint)
    ...
}

我可以在调试时用断点捕获异常.但是,如果异常发生在FunctionA()FunctionB(),或其他一些功能,我无法追溯.(假设广泛的异常使用和上述示例的巨大版本).

我的问题的一个解决方案是在异常构造函数中确定并保存调用堆栈(即在捕获之前).但这需要我从这个基类异常类派生所有异常.它还需要很多代码,并且可能会减慢我的程序速度.

是否有更简单的方法需要更少的工作?无需更改我的大代码库?

在其他语言中是否有更好的解决方案?



1> Jeremy..:

您在代码中指向了断点.由于您在调试器中,您可以在异常类的构造函数上设置断点,或者设置Visual Studio调试器以中断所有抛出的异常(Debug-> Exceptions单击C++异常,选择thrown和uncaught选项)



2> MP24..:

如果你只对异常的来源感兴趣,你可以写一个简单的宏

#define throwException(message) \
    {                           \
        std::ostringstream oss; \
        oss << __FILE __ << " " << __LINE__ << " "  \
           << __FUNC__ << " " << message; \
        throw std::exception(oss.str().c_str()); \
    }

这将把文件名,行号和函数名添加到异常文本中(如果编译器提供了相应的宏).

然后使用抛出异常

throwException("An unknown enum value has been passed!");



3> Matt Dillard..:

这是John Robbins写的一本优秀的书,它解决了许多困难的调试问题.这本书称为Microsoft .NET和Microsoft Windows的调试应用程序.尽管有标题,但本书包含有关调试本机C++应用程序的大量信息.

在本书中,有一个冗长的部分,关于如何获取抛出的异常的调用堆栈.如果我没记错的话,他的一些建议涉及使用结构化异常处理(SEH)而不是(或除了)C++异常.我真的不能高度推荐这本书.

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有