try-catch 不能处理 solidity 中的错误吗?

Can try-catch not handle an error in solidity?

我有内部函数

function _somefunction() internal {
    if (address(attr) != address(0)) {
        try attr.maybedoesntexist() {
        } catch Error(string memory message) {
            emit SomethingFailed();
        } catch {
            emit SomethingFailed();
        }
    }
}

当我在 hardhat 中测试它时,我将 attr 设置为非合同,但不知何故,错误 function call to a non-contract account 经历了第一次捕获,整个事情恢复了。

没有其他函数使用attr,错误完全取决于attr是否为合约账户。 catch居然不能处理一些错误?

调用 non-contracts 的异常目前 (v0.8) 未被 try/catch 捕获。

您可以验证地址是否为合约,并且只调用合约:

// length of attr's bytecode is 0, it's not a contract
if (address(attr).code.length == 0) {
    return;
}

try attr.maybedoesntexist() {