【问题标题】:Visual Studio Exception settings ignored C++Visual Studio 异常设置忽略 C++
【发布时间】:2017-12-10 09:54:44
【问题描述】:

我正在 Visual Studio 2017 中的 C++ 中测试 assert 方法,并且我得到了一个断言异常,正如我所预料的那样。但是在关闭所有(!)异常设置后,我仍然会在我的 catch 块处理之前抛出异常(参见下面的示例)。

try {
    assert(validate(1363821) == false);
    assert(validate(3848238) == true);
    printf("Validation correctly implemented.");
} catch ( exception & e ){
    const string error = e.what();
    printf("Validation failed!");
}

所以我的问题是:

  • 我在这里做错了吗?
  • 或者 assert 方法是否会抛出某种不能被 catch 块处理的异常,并且总是会产生致命异常?如果是这样,如何实现断言方法而不产生致命错误?

我的异常设置未设置如下:

非常感谢任何帮助!

【问题讨论】:

  • 如果 I still get an exception thrown before it can be handled by my catch block 你的意思是你得到一个消息框,那不是 Visual Studio,这就是 assert 的实现方式。
  • @tkausl 消息框标题为“Microsoft Visual C++ 运行时库”并给出“调试错误!”信息。这不是 Visual Studio 吗?如果没有,如何防止这个消息框?还是这种行为无法改变?
  • 在发布模式下编译。但是您的代码似乎是在检查您的代码是否按您期望的方式工作,您应该为此目的使用测试框架。
  • 如果您希望程序尽快终止,请使用assert,因为它刚刚发现了程序员需要通过修复代码并发布新版本来处理的错误。如果您希望您的程序继续执行某些操作(“某事”是您在 catch 块中的代码,它甚至可能不会导致程序终止,但会让您的程序愉快地继续执行),您会抛出一个异常。这两种语言特性不应相互混淆。

标签: c++ exception-handling visual-studio-2017 try-catch assert


【解决方案1】:

断言失败不应引发任何异常。相反,它执行一些特定于实现的报告操作(例如将错误消息打印到标准错误或显示该对话框),然后调用std::abort。所以catch IDE 中的块和/或异常处理设置在这种情况下不会做任何事情。如果您希望断言引发异常,则需要编写自己的 assert 宏替换。

如果您正在寻找某种类型的验证检查,那么您最好使用一些专用框架,例如 boost::test。那么你可以简单地写:

 BOOST_AUTO_TEST_CASE(Doc_Parse_Empty)
 {
     BOOST_TEST(validate(1363821) == false);
     BOOST_TEST(validate(3848238) == true);
 }

它还会自动处理成功/失败报告并无缝集成到 VS 中。

【讨论】:

  • 啊,我明白了。所以我猜断言方法在指出我有一个错误并终止应用程序方面实际上是正确的,这样我就不能用 try catch 块轻易地绕过它。是这样吗?
  • 只是想知道...我猜是因为异常设置“Win32 Exceptions > 0xc0000420 Assertion Failed”,我被设置在错误的轨道上。所以显然这与抑制 Assert 方法错误无关?!
  • @etri 恐怕存在assert 宏来处理调试版本中的不变量检查。并且任何断言失败都被视为致命错误(即不允许继续执行程序)。但我已经用一些替代方法更新了我的答案。
  • @etri Win32 异常与 C++ exceptions 不同,不能用 C++ try..catch 块捕获。实际上,其中一些是硬件异常,而另一些只是运行时处理致命错误的方式(断言失败是此类错误之一)。
  • 我不同意assert 仅用于“调试”构建的观点。我认为assert 在“发布”版本中非常重要,可以防止错误代码破坏数据或造成安全漏洞。 assert 甚至可以通过NDEBUG 为每个编译单元启用或禁用。你需要的是一个可靠的进程重启机制。
猜你喜欢
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2017-09-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
相关资源
最近更新 更多