У меня есть внутренняя функция
function _somefunction() internal {
if (address(attr) != address(0)) {
try attr.maybedoesntexist() {
} catch Error(string memory message) {
emit SomethingFailed();
} catch {
emit SomethingFailed();
}
}
}
Когда я проверяю это в каске, я устанавливаю attr как неконтрактную, но каким-то образом ошибка function call to a non-contract account проходит через первый улов, и все возвращается.
Никакая другая функция не использует attr, и ошибка полностью зависит от того, является ли attr контрактной учетной записью. Может ли catch на самом деле не обрабатывать некоторые ошибки?





Исключения из вызовов не-контрактов в настоящее время (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() {