C++ MSVC - 显示未捕获的异常消息

问题描述 投票:0回答:2

我有一个简单的 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 上编译此程序,以显示运行时抛出的异常?

c++ exception visual-c++ compilation
2个回答
0
投票

如何使用 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;
}

0
投票

我认为你的要求是不可能的,但我希望被证明是错误的。 GCC 在这方面击败了 MSVC。据我所知,找出导致异常的原因的唯一方法是使用 Visual Studio IDE。从那里我“开始调试”,“异常未处理”弹出窗口将显示异常类型。从“Call Stack”窗口我还可以找出哪一行导致了异常。

但是既然你提到了

PowerShell
,那可能是你是从命令行编译运行的。如果是这样,您至少可以通过使用 CRT 调试库之一来通知您发生了一些异常,因此您的完整命令行可能是:

cl /MTd /EHsc file.cpp

运行

file.exe
(使用您的示例代码)会弹出相同的“调试错误!”当您“启动而不调试”时,您在 Visual Studio 中获得的消息框。

© www.soinside.com 2019 - 2024. All rights reserved.