如何使Visual Studio 2013显示未处理的异常消息?

时间:2014-12-17 20:28:35

标签: c++ visual-studio exception visual-studio-2013

我在我的C ++程序中抛出此错误并且不处理它:

throw std::runtime_error("X failed because " + my_string);

我使用Visual Studio 2013编译并运行它,并收到以下错误:

  

bla.exe中0x7617C42D处的未处理异常:Microsoft C ++异常:内存位置为0x009FEA98的std :: runtime_error。

如何在不处理代码错误的情况下看到“X失败因为......”消息?

2 个答案:

答案 0 :(得分:1)

如果你只想弄清楚哪个异常导致你的程序在调试时终止,你可以简单地断开然后导航调用堆栈以查看抛出异常的位置。

如果您处于调试模式,则调用堆栈的顶部可能指向_CxxThrowException。在这种情况下,您可以检查其参数pExceptionObject,甚至可以将((std::exception*)pExceptionObject)->what()之类的内容添加到监视列表中。但是,这依赖于一些并非总是有效的假设。

添加catch (std::exception& e)并在那里检查错误真的更容易。

答案 1 :(得分:1)

您可以轻松创建一个异常包装器,将异常' s what()输出到调试输出。虽然这不需要你添加catch块来处理抛出异常的直接位置,但是它需要你用wrapper类包装所有的throw调用。例如:

class ExceptionOutputDebug : public std::exception
{
    public:
    ExceptionOutputDebug(const std::exception& e)
    {
        OutputDebugString(e.what());
        OutputDebugString("\n");
        if (1) // avoids C4702 (unreachable code)
            throw e;
    }
};

用法:

throw ExceptionOutputDebug(std::runtime_error("Die"));

然后输出到调试输出窗口:

Die
First-chance exception at 0x76CAC42D in blah.exe: Microsoft C++ exception: std::exception at memory location 0x019EFEBC.

如果您的程序抛出了很多异常,并且已经禁用了调试器,那么这可能很有用。如果在调试器外部运行,并且OutputDebugString调用被一些外部日志记录机制替换(对于控制台应用程序可能就像printf一样简单),它也可能很有用。