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

10

我在我的C++程序中抛出了这个错误,但没有进行处理:

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

我使用Visual Studio 2013编译和运行时,出现以下错误:

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

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


你的异常抛出后有没有对应的 catch 块?如果没有,那么你当然会收到“未处理的异常”消息。 - PaulMcKenzie
@PaulMcKenzie 我想使用Visual Studio调试界面来查看未处理异常的what(),而不仅仅是知道出现了未处理异常。 - Anna
1
在Visual C++中,未处理的异常会被路由到默认的未预期处理程序,该处理程序会调用terminate()函数。据我所知,在这一点上,抛出的异常对象并没有在未预期处理程序中提供,因此无法确定其内容可能是什么。 - Colin Robertson
2
我向VS团队提出了一个功能请求。您可以在此处投票并跟踪它:https://developercommunity.visualstudio.com/idea/366698/ability-to-examine-exception-object-on-unhandled-e.html - Dan M.
2个回答

1
您可以轻松地创建一个异常包装器,将异常的what()输出到调试输出。虽然这不需要您添加catch块来处理抛出异常的位置,但需要您使用包装器类包装所有的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),它也可能很有用。

1
如果您只是试图在调试时确定哪个异常导致程序终止,您可以简单地打断点,然后浏览调用堆栈以查看异常抛出的位置。
如果您处于调试模式,则调用堆栈顶部可能会指向_CxxThrowException。在这种情况下,您可以检查其参数pExceptionObject,甚至将类似((std::exception*)pExceptionObject)->what()添加到监视列表中。但是,这依赖于一些并不总是有效的假设。
更容易的方法是添加一个catch(std::exception& e)并在那里检查错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接