跳转到内容

调试

Tact 中调试智能合约常用的函数列表。

require

fun require(condition: Bool, error: String);

检查 condition 并抛出错误,如果 conditionfalse,则从 error 消息中生成 exit code。 除此之外,别无其他作用。

生成退出码的算法如下:

  • 首先,获取错误报文 StringSHA-256 哈希值。
  • 然后,它的值被作为一个32位的 大端 数字读取,计算方式是对 6300063000 取模后加上 10001000,按此顺序进行。
  • 最后,它将被放入 .md 编译报告文件,该文件与其他编译工件一起存放在项目的 outputs/build/ 目录中。

保证生成的退出码不在为 TVM 和 Tact 合约错误保留的常用 02550 - 255 范围内,这样就可以将退出码与 require() 和任何其他 标准退出码 区分开来。

示例用法:

// now() has to return a value greater than 1000, otherwise an error message will be thrown
require(now() > 1000, "We're in the first 1000 seconds of 1 January 1970!");
try {
// The following will never be true, so this require would always throw
require(now() < -1, "Time is an illusion. Lunchtime doubly so.");
} catch (e) {
// e will be outside of range 0-255
dump(e);
}

dump

fun dump(arg);

将参数 arg 打印到合约的调试控制台。 仅当配置文件 中的 “debug “选项设置为 true 时才进行评估,否则不执行任何操作。

可应用于下列类型和值:

示例用法:

// Int
dump(42);
// Bool
dump(true);
dump(false);
// Address
dump(myAddress());
// Cell, Builder or Slice
dump(emptyCell()); // Cell
dump(beginCell()); // Builder
dump(emptySlice()); // Slice
// String or StringBuilder
dump("Hello, my name is..."); // String
dump(beginTailString()); // StringBuilder
// Maps
let m: map<Int, Int> = emptyMap();
m.set(2 + 2, 4);
dump(m);
// Special values
dump(null);
dump(emit("msg".asComment())); // As emit() function doesn't return a value, dump() would print #DEBUG#: void.

dumpStack

fun dumpStack();

持久状态变量的所有值打印到合约的调试控制台。 仅当配置文件 中的 “debug “选项设置为 true 时才进行评估,否则不执行任何操作。

用法示例:

contract DumpsterFire {
var1: Int = 0;
var2: Int = 5;
receive() {
dumpStack(); // would print 0 5
}
}

throw

fun throw(code: Int);

nativeThrow()的别名。

nativeThrow

fun nativeThrow(code: Int);

抛出错误代码等于 code 的异常。 当前上下文的执行将停止(nativeThrow 后的语句将不会执行),控制权将传递给调用栈中的第一个try...catch。 如果调用者函数中不存在 trytry...catch 块,TVM将终止事务。

试图在 0655350 - 65535 范围之外指定 code 时,会出现 exit code 5异常:Integer out of expected range

示例用法:

fun thisWillTerminate() {
nativeThrow(42); // throwing with exit code 42
}
fun butThisDoesNot() {
try {
nativeThrow(42); // throwing with exit code 42
}
// ... follow-up logic ...
}

nativeThrowIf

fun nativeThrowIf(code: Int, condition: Bool);

类似于 nativeThrow(),但会在 condition 等于 true 时有条件地抛出异常。 否则不会抛出。

试图在 0655350 - 65535 范围之外指定 code 时,会出现 exit code 5 异常:Integer out of expected range

示例用法:

fun thisWillTerminate() {
nativeThrowIf(42, true); // throwing with exit code 42
}
fun butThisDoesNot() {
try {
nativeThrowIf(42, true); // throwing with exit code 42
}
// ... follow-up logic ...
}

nativeThrowUnless

fun nativeThrowUnless(code: Int, condition: Bool);

类似于 nativeThrow(),但会在 condition 等于 false 时有条件地抛出异常。 否则不会抛出。

试图在 0655350 - 65535 范围之外指定 code 时,会出现 exit code 5 异常:Integer out of expected range

使用示例:

fun thisWillTerminate() {
nativeThrowUnless(42, false); // throwing with exit code 42
}
fun butThisDoesNot() {
try {
nativeThrowUnless(42, false); // throwing with exit code 42
}
// ... follow-up logic ...
}