ZeroErr
载入中...
搜索中...
未找到
断言(Assertion)

断言是一个表达式,用来约束当前的程序变量符合一定的条件。如果断言失败,程序会抛出一个异常。断言通常用于调试和测试,可以在程序中加入一些检查点,确保程序的正确性。 我们提供了高级的断言库,可以用来检查变量的类型、值、长度等。

断言级别

ZeroErr提供三种不同级别的断言:

  • CHECK: 警告级别(WARN)- 当断言失败时,会输出警告信息,但程序继续执行
  • REQUIRE: 错误级别(ERROR)- 当断言失败时,会抛出异常并中断当前执行流
  • ASSERT: 致命级别(FATAL)- 当断言失败时,会抛出异常并应该终止程序

断言类型

基本断言

最基本的断言用于检查条件是否为真:

CHECK(条件); // 警告级别断言
REQUIRE(条件); // 错误级别断言
ASSERT(条件); // 致命级别断言
#define ASSERT(...)
定义 assert.h:173
#define CHECK(...)
定义 assert.h:167
#define REQUIRE(...)
定义 assert.h:170

反向断言

检查条件是否为假:

CHECK_NOT(条件); // 检查条件为假,否则显示警告
REQUIRE_NOT(条件); // 检查条件为假,否则抛出错误
ASSERT_NOT(条件); // 检查条件为假,否则抛出致命错误
#define REQUIRE_NOT(...)
定义 assert.h:171
#define CHECK_NOT(...)
定义 assert.h:168
#define ASSERT_NOT(...)
定义 assert.h:174

异常断言

检查代码是否抛出异常:

CHECK_THROWS(可能抛出异常的表达式); // 检查是否抛出异常,否则显示警告
REQUIRE_THROWS(可能抛出异常的表达式); // 检查是否抛出异常,否则抛出错误
ASSERT_THROWS(可能抛出异常的表达式); // 检查是否抛出异常,否则抛出致命错误
#define ASSERT_THROWS(...)
定义 assert.h:175
#define CHECK_THROWS(...)
定义 assert.h:169
#define REQUIRE_THROWS(...)
定义 assert.h:172

比较断言

提供各种比较操作的断言:

// 相等比较 (EQ)
CHECK_EQ(左值, 右值); // 检查左值 == 右值
REQUIRE_EQ(左值, 右值); // 检查左值 == 右值
ASSERT_EQ(左值, 右值); // 检查左值 == 右值
// 不等比较 (NE)
CHECK_NE(左值, 右值); // 检查左值 != 右值
REQUIRE_NE(左值, 右值); // 检查左值 != 右值
ASSERT_NE(左值, 右值); // 检查左值 != 右值
// 大于比较 (GT)
CHECK_GT(左值, 右值); // 检查左值 > 右值
REQUIRE_GT(左值, 右值); // 检查左值 > 右值
ASSERT_GT(左值, 右值); // 检查左值 > 右值
// 大于等于比较 (GE)
CHECK_GE(左值, 右值); // 检查左值 >= 右值
REQUIRE_GE(左值, 右值); // 检查左值 >= 右值
ASSERT_GE(左值, 右值); // 检查左值 >= 右值
// 小于比较 (LT)
CHECK_LT(左值, 右值); // 检查左值 < 右值
REQUIRE_LT(左值, 右值); // 检查左值 < 右值
ASSERT_LT(左值, 右值); // 检查左值 < 右值
// 小于等于比较 (LE)
CHECK_LE(左值, 右值); // 检查左值 <= 右值
REQUIRE_LE(左值, 右值); // 检查左值 <= 右值
ASSERT_LE(左值, 右值); // 检查左值 <= 右值
#define CHECK_GE(...)
定义 assert.h:203
#define CHECK_LE(...)
定义 assert.h:201
#define REQUIRE_LE(...)
定义 assert.h:207
#define REQUIRE_GT(...)
定义 assert.h:208
#define CHECK_LT(...)
定义 assert.h:200
#define REQUIRE_LT(...)
定义 assert.h:206
#define CHECK_NE(...)
定义 assert.h:199
#define REQUIRE_EQ(...)
定义 assert.h:204
#define ASSERT_LT(...)
定义 assert.h:212
#define ASSERT_NE(...)
定义 assert.h:211
#define REQUIRE_GE(...)
定义 assert.h:209
#define ASSERT_GE(...)
定义 assert.h:215
#define CHECK_GT(...)
定义 assert.h:202
#define CHECK_EQ(...)
定义 assert.h:198
#define ASSERT_EQ(...)
定义 assert.h:210
#define ASSERT_GT(...)
定义 assert.h:214
#define REQUIRE_NE(...)
定义 assert.h:205
#define ASSERT_LE(...)
定义 assert.h:213

自定义消息

所有断言宏都支持添加自定义消息,将在断言失败时显示:

CHECK(x > 0, "x必须为正数,当前值:{}", x);
REQUIRE_EQ(result, expected, "计算结果不匹配,期望:{},实际:{}", expected, result);

禁用断言

如果希望在发布模式下禁用所有断言,可以定义ZEROERR_NO_ASSERT宏:

#define ZEROERR_NO_ASSERT
#include <zeroerr/assert.h>

断言结果输出

当断言失败时,ZeroErr会自动输出详细的错误信息,包括:

  • 断言级别(WARN/ERROR/FATAL)
  • 断言表达式及其展开结果
  • 源文件位置和行号
  • 自定义错误消息(如果提供)