【问题标题】:How to continue executing functions when `require` evaluates false当`require`评估为false时如何继续执行函数
【发布时间】:2021-06-27 20:41:51
【问题描述】:

我有一个关于修饰符、需求和功能流程的问题。

这里有一个简单的例子来说明我的观点。

contract Numbers {
    uint256[] private _numbers;

    modifier bigNumber(uint256 someNumber) {
        require(someNumber > 10, "Numbers: Number must be greater than 10");
        _;
    }

    function _addNumber(uint256 someNumber) private bigNumber(someNumber) {
        _numbers.push(someNumber);
    }

    function addNumbers(uint256[] memory _newNumbers) external {
        for (uint256 i = 0; i < _newNumbers.length; i++) {
            _addNumber(_newNumbers[i]);
        }
    }
}

假设我用addNumbers([11, 12, 13, 8, 20, 21, 5, 22, 23]);调用这个函数

当它达到 8 时我会收到一个错误。

有没有办法使用以下值继续运行函数?

我之前想过添加一个if 来“捕获”错误,但也许有更好的方法。

提前致谢!

【问题讨论】:

    标签: ethereum solidity smartcontracts hardhat


    【解决方案1】:

    失败的require() 条件抛出异常。


    在您的情况下,最简单的方法是在您的 addNumbers() 函数中复制条件。

    function addNumbers(uint256[] memory _newNumbers) external {
        for (uint256 i = 0; i < _newNumbers.length; i++) {
    
            // duplicated condition from the modifier
            if (_newNumbers[i] <= 10) {
                _addNumber(_newNumbers[i]);
            }
        }
    }
    

    如果 _addNumber() 函数是 external(即从合约外部可执行),您可以使用 try/catch 表达式。

    // mind the changed visibility from `private` to `external`
    function _addNumber(uint256 someNumber) external bigNumber(someNumber) {
        _numbers.push(someNumber);
    }
    
    function addNumbers(uint256[] memory _newNumbers) external {
        for (uint256 i = 0; i < _newNumbers.length; i++) {
            try this._addNumber(_newNumbers[i]) {
                // do nothing if didn't throw an exception
            } catch (bytes memory) {
                // do nothing if threw an exception
            }
        }
    }
    

    Try/catch 目前 (v0.8) 仅支持外部调用和合约创建。这就是为什么您需要将 _addNumber() 函数设为外部才能使其工作。

    文档:https://docs.soliditylang.org/en/v0.8.6/control-structures.html#try-catch

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 2012-05-13
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      相关资源
      最近更新 更多