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
答案 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“隐藏”消息,因为在程序终止时无需打印消息。