Skip to content

调试

列出了一些常用于调试 Tact 智能合约的函数。

了解更多关于调试的信息,请访问专门页面:调试

require

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

检查 condition,如果 conditionfalse,则抛出带有 error 信息的异常。否则什么也不做。

注意,目前 require() 生成自己的非标准退出代码。然而,它们都在 $0 - 255$ 的常见范围之外,这个范围是为 TVM 和 Tact 合约错误保留的,这使得可以区分 require() 的退出代码和任何其他 标准退出代码

使用示例:

solidity
// now() 必须返回一个大于 1000 的值,否则将抛出错误信息
require(now() > 1000, "We're in the first 1000 seconds of 1 January 1970!");

try {
    // 以下永远不会为真,因此此 require 总是会抛出
    require(now() < -1, "Time is an illusion. Lunchtime doubly so.");
} catch (e) {
    // e 将在 0-255 范围之外
    dump(e);
}

dump

solidity
fun dump(arg);

将参数 arg 打印到合约的调试控制台。仅当 配置文件 中的 debug 选项设置为 true{:json} 时才会被评估,否则什么也不做。

js
// tact.config.json
{
    "projects": [{
        "name": "***",
        "path": "./sources/contract.tact",
        "output": "./sources/output",
        "options":{
           "debug": true
        }
    }]
}

可以应用于以下类型和值:

使用示例:

solidity
// Int
dump(42);

// Bool
dump(true);
dump(false);

// Address
dump(myAddress());

// Builder, Cell 或 Slice
dump(beginCell());           // Builder
dump(emptyCell());           // Cell
dump(emptyCell().asSlice()); // Slice

// String 或 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

solidity
fun dumpStack();

将所有 持久化状态变量 的值打印到合约的调试控制台。仅当 配置文件 中设置了 debug 选项时才会被评估,否则什么也不做。

使用示例:

solidity
contract DumpsterFire {
    var1: Int = 0;
    var2: Int = 5;

    receive() {
        dumpStack(); // 将打印 0 5
    }
}

throw

solidity
fun throw(code: Int);

nativeThrow() 的别名。

nativeThrow

solidity
fun nativeThrow(code: Int);

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

使用示例:

solidity
fun thisWillTerminate() {
    nativeThrow(42); // 抛出退出代码 42
}

fun butThisDoesNot() {
    try {
        nativeThrow(42); // 抛出退出代码 42
    }

    // ... 后续逻辑 ...
}

nativeThrowIf

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

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

使用示例:

solidity
fun thisWillTerminate() {
    nativeThrowIf(42, true); // 抛出退出代码 42
}

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

nativeThrowUnless

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

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

使用示例:

solidity
fun thisWillTerminate() {
    nativeThrowUnless(42, false); // 抛出退出代码 42
}

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