abort 和 assert

在 Sui 上的事务中,对全局存储的更改是“全有或全无”的。更改只有在区块成功消化后才会被确认。如果在执行期间事务遇到错误,则其中的任何更改都将被丢弃。

除了除以 0 值等意外错误外,开发人员还可以通过表达式 abortassert 主动使事务失败。

1. abort

abort 可以中止当前事务的执行,它接受一个 u64 类型的中止代码作为参数。

abort 66

当函数执行遇到 abort 66 时,事务将被中止并以错误结束:

public entry fun testAbort(demo: &mut Demo, input: u64) {
    if (input > 100) {
        abort 66
    };
    demo.v = demo.v + 1;
}

abort

您可以找到中止代码 66 以及中止发生的函数(testAbort)。

2. assert

assert 表达式也可以通过中止代码中止事务,不同于 abort 表达式,它接受两个参数:一个条件(bool)和一个中止代码(u64)。

assert!(a == b, 66);

注意 assert! 符号,这将 assert 与函数调用区分开来。assert 类似于宏或语法糖,使上面的示例等效于:

if (a == b) {

} else {
    abort 66
};

在测试中尝试:

public entry fun testAssert(demo: &mut Demo, input: u64) {
    assert!(input > 100, 66);
    demo.v = demo.v + 1;
}

abort

您可以看到 testAssert 函数调用以代码 66 中止,错误日志与 abort 表达式的示例相同。