在 Unreal Engine 中,check
、verify
和 ensure
是三个常用的宏,用于在代码中添加断言和错误检查。它们的行为和用途有所不同,以下是它们的详细对比:
1. check
行为:
- 调试模式(Development Build):
- 如果条件为
false
,触发断言失败,程序中断并记录错误信息。 - 适合用于开发阶段的调试。
- 如果条件为
- 发布模式(Shipping Build):
- 完全被编译器移除,不会产生任何运行时开销或检查。
适用场景:
- 用于开发阶段的调试,确保某些条件在开发过程中始终为真。
- 不适合发布版本,因为会被移除。
示例:
check(GameViewportWindow.IsValid()); // 仅在调试模式下检查
2. verify
行为:
- 调试模式(Development Build):
- 如果条件为
false
,触发断言失败,程序中断并记录错误信息。
- 如果条件为
- 发布模式(Shipping Build):
- 如果条件为
false
,程序仍然会中断。 - 与
check
不同,verify
在发布模式下不会被移除。
- 如果条件为
适用场景:
- 用于关键检查,确保某些条件在发布版本中也必须为真。
- 如果条件不满足,程序会立即中断,适合用于不可恢复的错误。
示例:
verify(GameViewportWindow.IsValid()); // 在调试和发布模式下都检查
3. ensure
行为:
- 调试模式(Development Build):
- 如果条件为
false
,记录错误信息,但程序不会中断。 - 返回
false
,允许开发者处理错误。
- 如果条件为
- 发布模式(Shipping Build):
- 如果条件为
false
,记录错误信息,但程序不会中断。 - 返回
false
,允许开发者处理错误。
- 如果条件为
适用场景:
- 用于非关键检查,允许程序在条件不满足时继续运行。
- 适合用于可以恢复的错误或警告场景。
示例:
if (!ensure(GameViewportWindow.IsValid())) // 记录错误但不中断
{
// 处理错误情况
}
对比表格
特性 | check | verify | ensure |
---|---|---|---|
调试模式行为 | 条件为 false 时中断程序 | 条件为 false 时中断程序 | 条件为 false 时记录错误,不中断 |
发布模式行为 | 被移除,无任何作用 | 条件为 false 时中断程序 | 条件为 false 时记录错误,不中断 |
返回值 | 无返回值 | 无返回值 | 返回 bool (条件是否为 true ) |
适用场景 | 开发阶段的调试检查 | 关键检查,发布模式也需生效 | 非关键检查,允许程序继续运行 |
使用建议
-
check
- 用于开发阶段的调试,确保某些条件在开发过程中始终为真。
- 例如:检查指针是否为空、数组索引是否越界等。
-
verify
- 用于关键检查,确保某些条件在发布版本中也必须为真。
- 例如:检查关键资源是否加载成功、重要对象是否有效等。
-
ensure
- 用于非关键检查,允许程序在条件不满足时继续运行。
- 例如:检查可选资源是否加载成功、处理用户输入是否有效等。
示例代码
void MyFunction()
{
// 使用 check(仅调试模式)
check(GameViewportWindow.IsValid()); // 如果无效,调试模式下中断
// 使用 verify(调试和发布模式)
verify(GameViewportWindow.IsValid()); // 如果无效,任何模式下都中断
// 使用 ensure(记录错误但不中断)
if (!ensure(GameViewportWindow.IsValid())) // 如果无效,记录错误但继续运行
{
UE_LOG(LogTemp, Error, TEXT("GameViewportWindow is invalid!"));
// 处理错误情况
}
}
总结
check
:适合开发阶段的调试检查,发布模式下无作用。verify
:适合关键检查,发布模式下也生效。ensure
:适合非关键检查,记录错误但允许程序继续运行。
根据具体需求选择合适的宏,可以更好地管理代码的健壮性和性能。