我有一个简单的 C++ 代码,我尝试使用 Visual Studio 2019 进行编译:
#include <iostream>
#include <stdexcept>
int main()
{
std::cout << "Hello World!\n";
throw std::runtime_error{ "TEST" };
return 0;
}
在
PowerShell
中运行此程序只会显示“Hello world”。根据我使用 GCC 的经验,我希望在终端输出中的某个位置看到包含 TEST
的消息,例如:
Hello World!
terminate called after throwing an instance of 'std::runtime_error'
what(): TEST
Aborted
这些是使用的编译器标志:
/permissive- /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc142.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /std:c++17 /FC /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\ThrowTest.pch" /diagnostics:column
如何使用 MSVC 在 Windows 上编译此程序,以显示运行时抛出的异常?
如何使用 MSVC 在 Windows 上编译此程序,以显示运行时抛出的异常?
如果你想在编译后看到消息,你需要 try catch 块,并且需要捕获异常:
int runTimeError(){
std::cout << "Hello World!\n";
try{
throw std::runtime_error( "TEST" );
}catch (std::exception& ex){
std::cout << ex.what();
}
return 0;
}
我认为你的要求是不可能的,但我希望被证明是错误的。 GCC 在这方面击败了 MSVC。据我所知,找出导致异常的原因的唯一方法是使用 Visual Studio IDE。从那里我“开始调试”,“异常未处理”弹出窗口将显示异常类型。从“Call Stack”窗口我还可以找出哪一行导致了异常。
但是既然你提到了
PowerShell
,那可能是你是从命令行编译运行的。如果是这样,您至少可以通过使用 CRT 调试库之一来通知您发生了一些异常,因此您的完整命令行可能是:
cl /MTd /EHsc file.cpp
运行
file.exe
(使用您的示例代码)会弹出相同的“调试错误!”当您“启动而不调试”时,您在 Visual Studio 中获得的消息框。