我在我的C ++程序中抛出此错误并且不处理它:
throw std::runtime_error("X failed because " + my_string);
我使用Visual Studio 2013编译并运行它,并收到以下错误:
bla.exe中0x7617C42D处的未处理异常:Microsoft C ++异常:内存位置为0x009FEA98的std :: runtime_error。
如何在不处理代码错误的情况下看到“X失败因为......”消息?
答案 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
一样简单),它也可能很有用。