Skip to main content

错误处理

  1. 错误处理方法: requirerevertassert
    • 这三种都有 gas 费的退还和状态变量回滚的特性。其中assert会抛出Panic(uint256)类型的错误
    • 如果异常在子调用发生,那么异常会自动冒泡到顶层
    • 如果是在 send 和 低级别如:call, delegatecallstaticcall 的调用里发生异常时, 他们会返回 false (第一个返回值) 而不是冒泡异常
    • 外部调用的异常可以被 try/catch 捕获
  2. 8.0 以后新增了自定义错误,具有节约 gas 的特性.自定义错误参数
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.3;

contract ErrorControl {
// require
function requireExample(uint256 index) external pure returns (uint256) {
// index小于等于10的时候会报错
require(index > 10, "index must gt 10");
return index;
}

// revert
function revertExample(uint256 index) external pure returns (uint256) {
if (index > 100) {
// index 大于等于100的时候会报错
revert("index must lt 100");
}
return index;
}

// assert
function assertExample(uint256 index) external pure returns (uint256) {
// index不等于30的时候会报错
assert(index == 30);
return index;
}

// 自定义错误
error MyError(address caller, uint256 index, string message);
function customError(uint256 index) public view returns (uint256) {
if (index > 10) {
revert MyError(msg.sender, index,"index can not gte 10");
}
return index;
}
}