Skip to content

Solidity中的异常处理 #64

Description

@MagicalBridge

基本概念

在 Solidity 中,错误处理控制报错是智能合约开发中的关键部分。Solidity 提供了几种机制来控制错误和异常:

  1. require:用于检查条件是否为真,如果条件为假,则会抛出异常并回滚交易。
  2. assert:用于检查不应该为假的条件,用于捕捉代码中的严重错误。
  3. revert:用于在特定条件下回滚交易,可以提供错误消息。
  4. 自定义错误:从 Solidity 0.8.4 开始,引入了自定义错误类型,用于节省 Gas 并提供更加具体的错误信息。

require

require 语句用于确保条件为真,否则会抛出异常并回滚所有状态更改。通常用于输入参数验证和执行前检查

function withdraw(uintamount) public {
require(amount <= balance, "Insufficient balance");
balance -= amount;
payable(msg.sender).transfer(amount);
}
  • 如果 amount 大于 balance,则交易会回滚并抛出 "Insufficient balance" 的错误信息。

assert

assert 语句用于检查内部错误和不变量。它主要用于验证代码逻辑的正确性。如果条件为假,则会抛出异常并回滚交易。

function transfer(addressto, uintamount) public {
balance[msg.sender] -= amount;
balance[to] += amount;
assert(balance[msg.sender] >=0);
}
  • 如果 balance[msg.sender] 小于 0,assert 会抛出异常,表示代码逻辑存在问题。

revert

revert 语句用于手动触发异常并回滚交易。可以带有错误消息。

function withdraw(uintamount) public {
if (amount > balance) {
revert("Insufficient balance");
}
balance -= amount;
payable(msg.sender).transfer(amount);
}
  • 如果 amount 大于 balancerevert 会回滚交易并抛出 "Insufficient balance" 的错误信息。

自定义错误

自定义错误类型在 Solidity 0.8.4 版本引入,用于提供更详细和节省 Gas 的错误信息。

// 声明自定义错误error InsufficientBalance(uintrequested, uintavailable);
contractExample {
uintpublic balance =100;
function withdraw(uintamount) public {
if (amount > balance) {
revertInsufficientBalance({
requested: amount,
available: balance
});
}
balance -= amount;
}
}
  • 如果 amount 大于 balance,会回滚交易并抛出 InsufficientBalance 错误,带有请求的金额和可用余额的详细信息。

比较

方法适用场景优点缺点
require条件检查,输入参数验证易读,提供错误消息错误消息占用更多 Gas
assert检查不变量和严重错误确保代码逻辑正确性异常不提供具体错误信息
revert手动触发错误灵活,可提供错误消息错误消息占用更多 Gas
自定义错误提供详细错误信息,节省 Gas更加具体,节省 Gas需要 Solidity 0.8.4 及以上版本

总结

在 Solidity 中,错误控制机制包括 requireassertrevert 以及自定义错误。这些机制提供了不同的方式来验证条件、捕捉错误和回滚交易。选择哪种机制取决于具体的应用场景和需要的错误信息详细程度。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions