如何让Visual Studio 2019的C++错误输出更具实用性?
解决VS2019中noexcept函数抛异常的错误提示问题
我完全懂你遇到的这个麻烦——VS2019默认配置下,这类违反noexcept承诺的问题要么藏得很深,要么直接在运行时给你个莫名其妙的崩溃窗口,根本不告诉你问题出在哪。咱们分两步来搞定:
一、让编译时就给出明确的错误提示(定位到代码行)
VS2019其实有对应的警告检测,但默认可能没开启或者没设为错误,按以下步骤配置:
- 右键你的C++项目,选择属性
- 进入
配置属性 → C/C++ → 警告- 把警告等级设为
/W4(这会开启更多细致的代码检查) - 在将特定警告视为错误里输入
4297(这个警告码对应的就是“函数声明为noexcept但抛出异常”的情况)
- 把警告等级设为
- 保存配置后重新编译
现在编译你的代码,就能在输出窗口看到清晰的提示:
warning C4297: 'My::f': function assumed not to throw an exception but does message : the function is declared 'noexcept' message : see declaration of 'My::f'
而且点击提示信息就能直接跳转到throw exception{"A problem sir!"};这一行,完美符合你的预期。
二、为什么运行时会弹出通用崩溃窗口?
这里还要纠正一个小误区:你的代码里的try-catch根本抓不到这个异常!因为noexcept的语义是承诺该函数不会抛出任何异常,一旦违反这个承诺,程序会直接调用std::terminate()终止运行,不会执行栈展开和catch块的逻辑。这就是为什么你运行时看到的是通用崩溃窗口,而不是预期的捕获提示。
如果想让异常被正常捕获,要么去掉noexcept修饰符,要么确保函数内部不会抛出异常。
内容的提问来源于stack exchange,提问作者Problem Sir
相关产品推荐
相关产品推荐

