【问题标题】:How to make Visual Studio 2013 show unhandled exception message?如何使 Visual Studio 2013 显示未处理的异常消息?
【发布时间】:2015-02-16 12:20:21
【问题描述】:

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

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

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

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

如果不处理代码中的错误,我如何才能看到消息“X failed because ...”?

【问题讨论】:

  • 你抛出的异常是否有 catch 块?如果没有,那么您当然会收到“未处理的异常”消息。
  • @PaulMcKenzie 我想使用 Visual Studio 调试界面查看未处理异常的what(),而不仅仅是知道存在未处理异常。
  • 在 Visual C++ 中,未处理的异常被路由到默认的意外处理程序,该处理程序又调用terminate()。据我所知,此时抛出的异常对象无法用于意外处理程序,因此无法确定其内容可能是什么。
  • 我已经向 VS 团队提出了功能请求。您可以在这里投票并跟踪它:developercommunity.visualstudio.com/idea/366698/…

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以轻松创建异常包装器,将异常的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 一样简单)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多