abort 和 assert
在 Sui 上的事务中,对全局存储的更改是“全有或全无”的。更改只有在区块成功消化后才会被确认。如果在执行期间事务遇到错误,则其中的任何更改都将被丢弃。
除了除以 0 值等意外错误外,开发人员还可以通过表达式 abort
或 assert
主动使事务失败。
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;
}
您可以找到中止代码 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;
}
您可以看到 testAssert
函数调用以代码 66 中止,错误日志与 abort
表达式的示例相同。