在输出窗口中仅对代码的特定部分禁用异常消息

Disable exception messages in output window only for specific portion of the code

提问人:Regus Pregus 提问时间:11/1/2023 更新时间:11/2/2023 访问量:30

问:

在 Visual Studio (MSVC) 中,有一个选项可以完全禁用输出窗口中的异常消息 ()。有没有办法(也许使用?)对代码的特定段禁用此类输出?Tools->Options->Debugging->Output Window->General Output Settings->Exception Messages=Off#pragma

用例:为无法转换为数字的非数字输入引发异常。然后,我的应用程序代码会正确捕获和处理此异常。由于此异常在正常程序运行期间发生多次,并且我已经捕获并处理了该异常,因此我不希望由特定代码行引起的有关此异常的消息污染调试器输出窗口,从而掩盖了我应该真正注意的其他一些新异常。我发现调试输出很有用,但是一旦我正确处理了特定的异常,我就不希望它在调试器输出窗口中保持混乱。std::stoi()

基本上,我想要以下内容:

...
//I want exception messages from here
...
try
{
  //I don't want exception messages from here because:
  //a) I have a ton of expected bad inputs during normal program run and
  //b) I have handled these exceptions
#pragma some_magic_pragma_here_to_disable_exception_messages
  auto result = std::stoi(str,pos,base);
#pragma some_magic_pragma_here_to_reenable_exception_messages
}
catch (std::invalid_argument &)
{
  //Do something here
}
catch (std::out_of_range &)
{
  //Do something here
}
catch (...)
{
  //Do something here
}
...
//I want exception messages from here again
...

我查看了 MSVC 编译指示列表,但找不到任何与我需要的内容非常相似的内容。

visual-studio 异常 visual-c++ visual-studio-debugging

评论

0赞 Ben Voigt 11/1/2023
#pragma是给编译器的指令,你需要给调试器的指令。(当异常消息处于打开或关闭状态时,代码的行为没有任何不同,调试器会在每种情况下看到异常,并决定是否记录消息)
0赞 Ben Voigt 11/1/2023
除此之外,例外并不意味着“预期的不良输入”。 打破了很多最佳实践。std::stoi
0赞 Regus Pregus 11/2/2023
我同意 std::stoi() 并不完美的事实,您选择将字符串转换为数字的机制是什么?
0赞 Ben Voigt 11/2/2023
IMO 很好 - 它可以处理所有相同的输入和错误,只是报告失败的方式不同。(识别和区分一些错误有点棘手,但这是一个带注释的一次性写入问题)您还可以为用户获得更好的反馈,例如,如果您希望“123X”抱怨“第 4 列中意外的'X'”,而不是简单的“无效输入”,您可以通过std::strtolstd::stoistrtol
0赞 Bowman Zhu-MSFT 11/2/2023
@RegusPregus我认为预处理器指令之类的东西无法控制调试器行为,你可以看看我的答案。:)

答:

0赞 Bowman Zhu-MSFT 11/2/2023 #1

有没有办法(也许使用 #pragma?)仅对代码的特定段禁用此类输出?

答案是否定的。VS 没有设计这样的东西。

你提到的技术是另一回事,预处理器指令是对预处理器的指令,预处理器是编译器的一部分,在编译之前处理你的代码。它们用于包含文件、定义宏、有条件地编译代码以及执行其他编译时操作。

你可以看看这个:

预处理

您分享的链接实际上属于这个概念。

调试器是用于在运行时查找和修复 bug 的工具。它与预处理器和编译器分开运行。

它仅限于通过 UI 更改调试器行为的某些设置,调试器的行为不通过预处理器指令控制。