【发布时间】: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