0

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

这是我的观点的一个简单示例。

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“捕获”错误,但也许有更好的方法。

提前致谢!

4

1 回答 1

0

失败的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

于 2021-06-27T21:37:24.533 回答