Appearance
调试
列出了一些常用于调试 Tact 智能合约的函数。
了解更多关于调试的信息,请访问专门页面:调试。
require
solidity
fun require(condition: Bool, error: String);
检查 condition
,如果 condition
为 false
,则抛出带有 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
}
}]
}
可以应用于以下类型和值:
Int
Bool
Address
Builder
、Cell
或Slice
String
或StringBuilder
map<K, V>
- Optionals 和
null
值 void
,当函数没有定义返回值时隐式返回
使用示例:
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
块。如果调用函数中没有 try
或 try...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
}
// ... 后续逻辑 ...
}