信息
文章中可能会出现一些错误,希望大佬们可以在评论区指出错误,感谢支持!
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() | - | 若此行被执行,程序停止执行,主要用于应被重写而不被调用的虚函数实现 |
其中,这些宏仅在Debug
和Development
环境下运行,Slow
结尾的宏仅在Debug
环境下运行。
如果:
- 怀疑
Check
宏中的代码在修改值; - 发现仅存在于发布版本(
Shipping
)中的难以追踪的bug;
可以设置USE_CHECKS_IN_SHIPPING=1
在Test
和Shipping
环境下启用这些宏,调试后记得还原设置。
verify
Verify
系列断言应该在Check
系列断言的范围外使用,它可以在发布版本中运行。
宏 | 参数 | 行为 |
---|---|---|
verify() 或 verifySlow() | 表达式 | 若表达式为false ,停止执行 |
verifyf() 或 verifyfSlow | 表达式,格式化文本 | 若表达式为false ,停止执行;并将格式化文本输出到日志 |
其中,这些宏仅在Debug
,Development
,Test
和Shipping Editor
版本中完整运行,Slow
结尾的宏仅在Debug
环境下运行。在上述其他情况下,Verify
系列断言只会计算表达式,而不会让程序停止执行或输出文本到日志。
ensure
Ensure
系列断言和Verify
系列断言类似,但仅可在出现非致命错误时使用。也就是说,如果Ensure
系列断言被触发,程序在通知崩溃报告器后仍会运行,并且在每次引擎或编辑器会话中仅报告一次。
宏 | 参数 | 行为 |
---|---|---|
ensure() | 表达式 | 若表达式首次为false ,通知崩溃报告器 |
ensureMsgf() | 表达式,格式化文本 | 若表达式首次为false ,通知崩溃报告器并将格式化文本输出到日志 |
ensureAlways() | 表达式 | 若表达式为false ,总是通知崩溃报告器 |
ensureAlwaysMsgf() | 表达式,格式化文本 | 若表达式为false ,总是通知崩溃报告器并将格式化文本输出到日志 |
其中,这些宏在所有环境下计算表达式的值,但仅在Debug
,Development
,Test
和Shipping Editor
环境中通知崩溃报告器。