跳到主要内容
信息
文章中可能会出现一些错误,希望大佬们可以在评论区指出错误,感谢支持!

10 - 断言

本文主要介绍了UE5中的断言,它可以在开发期间帮助检测和诊断不正常或无效的程序运行时条件。UE5提供了如下三种断言:

  • Check
  • Verify
  • Ensure

这三种断言相关的宏可在Engine/Source/Runtime/Core/Public/Misc/AssertionMacros.h中查看。

check

Check系列的断言是最接近C++assert的,当第一个参数计算值为false时,程序会立刻停止执行,并默认不会在发布版本中运行。

参数行为
check()checkSlow()表达式若表达式为false,停止执行
checkf()checkfSlow()表达式,格式化文本若表达式为false,停止执行;并将格式化文本输出到日志
checkCode()代码在一次do-while循环中执行代码,主要用于准备另一个Check所需的信息
checkNoEntry()-若此行被执行,程序停止执行,主要用于不可到达的代码路径
checkNoReentry()-若此行被执行超过一次,则程序停止执行
checkNoRecursion()-若此行被递归执行,则程序停止执行
unimplemented()-若此行被执行,程序停止执行,主要用于应被重写而不被调用的虚函数实现

其中,这些宏仅在DebugDevelopment环境下运行,Slow结尾的宏仅在Debug环境下运行。

如果:

  • 怀疑Check宏中的代码在修改值;
  • 发现仅存在于发布版本(Shipping)中的难以追踪的bug;

可以设置USE_CHECKS_IN_SHIPPING=1TestShipping环境下启用这些宏,调试后记得还原设置。

verify

Verify系列断言应该在Check系列断言的范围外使用,它可以在发布版本中运行。

参数行为
verify()verifySlow()表达式若表达式为false,停止执行
verifyf()verifyfSlow表达式,格式化文本若表达式为false,停止执行;并将格式化文本输出到日志

其中,这些宏仅在DebugDevelopmentTestShipping Editor版本中完整运行,Slow结尾的宏仅在Debug环境下运行。在上述其他情况下,Verify系列断言只会计算表达式,而不会让程序停止执行或输出文本到日志。

ensure

Ensure系列断言和Verify系列断言类似,但仅可在出现非致命错误时使用。也就是说,如果Ensure系列断言被触发,程序在通知崩溃报告器后仍会运行,并且在每次引擎或编辑器会话中仅报告一次。

参数行为
ensure()表达式若表达式首次为false,通知崩溃报告器
ensureMsgf()表达式,格式化文本若表达式首次为false,通知崩溃报告器并将格式化文本输出到日志
ensureAlways()表达式若表达式为false,总是通知崩溃报告器
ensureAlwaysMsgf()表达式,格式化文本若表达式为false,总是通知崩溃报告器并将格式化文本输出到日志

其中,这些宏在所有环境下计算表达式的值,但仅在DebugDevelopmentTestShipping Editor环境中通知崩溃报告器。

参考资料