Visual Studio /调试器隐藏的异常消息在错误的行上中断

时间:2018-09-26 08:11:01

标签: c++ visual-studio

Visual Studio隐藏了我的异常消息。以下面的代码示例:

#include <stdio.h>
#include <iostream>
#include <exception>

void exceptional_method(){
    throw std::runtime_error("Hello from exceptional_method!");
}

int main(){
    std::cout << "Hello world!" << std::endl;
    exceptional_method();
    std::cin.get();
}

Visual Studio给了我一些模糊的地址:

Unhandled exception at 0x76A9DDC2 in ExceptionTest.exe: Microsoft C++ exception: std::runtime_error at memory location 0x006FFD34.

而Linux mint在终端上给了我以下输出:

Hello world!
terminate called after throwing an instance of 'std::runtime_error'
  what():  Hello from exceptional_method!
Aborted (core dumped)

我用Google搜索了一堆,弄乱了Visual Studio中的设置,但无法弄清楚。我当前的解决方法是在引发异常之前将异常消息写入控制台,以便至少可以捕获该消息,以便知道引发了哪个异常。

inline void throw_exception(string& message)
{
    cout << message << endl;
    throw runtime_error(message);
}

这不是理想的。任何帮助将不胜感激。

编辑: 问题是让调试器在实际异常上而不是前面几行中断,这是导致我研究错误代码的问题。 以下是我一直在寻找的解决方案。

#ifndef DEBUG_ASSERT_H
#define DEBUG_ASSERT_H

#include <iostream>
#include <string>

using std::cout;
using std::endl;
using std::string;

inline void log_failed_assert(const string message, const string expression, const string file, const long line) {
    cout << "Assert failed." << endl;
    cout << "Expression: "   << expression  << endl;
    cout << "Message   : "   << message     << endl;
    cout << "File      : "   << file        << endl;
    cout << "Line      : "   << line        << endl;
}

inline void windows_break()
{
#ifdef _WIN32
    __debugbreak();
#endif
}

//do {
//} while (0)

#ifdef _DEBUG
#ifdef _WIN32
#define DEBUG_ASSERT(expr, s) do{\
    if(!(expr)){\
        log_failed_assert(s, #expr, __FILE__, __LINE__);\
        __debugbreak();\
    }\
    } while(0)
#else
#define DEBUG_ASSERT(expr, s) do{\
    if(!(expr)){\
        log_failed_assert(s, #expr, __FILE__, __LINE__);\
    }\
    } while(0)
#endif
#else
#define DEBUG_ASSERT(expr, s)
#endif

#endif

1 个答案:

答案 0 :(得分:2)

有异常要捕获。如果您没有抓住它,您的程序将终止。如果这是您想要的,则有更简便的终止方法。如果您在main中捕获到异常,则可以使用该消息来进行打印:

#include <exception>
#include <iostream>
void exceptional_method(){
    throw std::runtime_error("Hello from exceptional_method!");
}

int main(){
    std::cout << "Hello world!" << std::endl;
    try {
        exceptional_method();
    } catch (std::exception& e) {
        std::cout << e.what(); 
    }
    std::cin.get();
}

正如RichardCritten所指出的那样,对您而言,这是一件好事,而不是Visual Studio“隐藏”消息,因为在程序终止时无需打印消息。