跳转到内容

调试

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

要求

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

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

生成退出代码的算法如下:

  • 首先,获取错误报文字符串SHA-256 哈希值。
  • 然后,按此顺序将其值读作一个 32 位 big-endian 数字 modulo 630006300010001000
  • 最后,它将被放入 .md 编译报告文件,该文件与其他编译工件一起存放在项目的 outputs/build/ 目录中。

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

使用示例

// now() 必须返回一个大于 1000 的值,否则将抛出错误信息
require(now() > 1000, "We're in the first 1000 seconds of January 1970!");
try {
// 下面的内容永远不会为真,所以这个 require 将总是抛出
require(now() < -1, "Time is an illusion.午餐时间更是如此。");
} catch (e) {
// e 将超出 0-255 范围
dump(e);
}

转储

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);
// 特殊值
dump(null);
dump(emit("msg".asComment())); // 由于 emit() 函数不返回值,dump() 将打印 #DEBUG#: void.

dumpStack

fun dumpStack();

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

使用示例

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

fun throw(code: Int);

nativeThrow()的别名。

nativethrow

fun nativeThrow(code: Int);

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

试图在 0655350 - 65535 范围之外指定 code 时,会出现 exit code 5异常:整数超出预期范围”。

使用示例

fun thisWillTerminate() {
nativeThrow(42); // 抛出退出代码 42
}
fun butThisDoesNot() {
try {
nativeThrow(42); // 抛出退出代码 42
}
// ... 后续逻辑 ...
}

原生抛出条件

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

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

试图在 0655350 - 65535 范围之外指定 code 时,会出现 exit code 5 异常:整数超出预期范围”。

使用示例

fun thisWillTerminate() {
nativeThrowIf(42, true); // 抛出退出代码 42
}
fun butThisDoesNot() {
try {
nativeThrowIf(42, true); // 抛出退出代码 42
}
// ... 后续逻辑 ...
}

本机无投掷

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

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

试图在 0655350 - 65535 范围之外指定 code 时,会出现 exit code 5 异常:整数超出预期范围”。

使用示例

fun thisWillTerminate() {
nativeThrowUnless(42, false); // 抛出退出代码 42
}
fun butThisDoesNot() {
try {
nativeThrowUnless(42, false); // 抛出退出代码 42
}
// ... 后续逻辑 ...
}