У меня есть следующий фрагмент кода:
function func() public returns (bool) {
if (some condition on msg.sender) {
do some stuff
return true;
}
revert();
}
Компилятор (0.4.24) не выдает никаких предупреждений об этом, хотя не все пути выполнения возвращают значение.
Конечно, я мог бы позвонить revert()
в самом начале (с противоположным условием) и избежать этой проблемы, но из соображений внутреннего стиля кодирования я предпочитаю, как показано выше.
Теперь я знаю, что в C++, например, функция может генерировать исключение вместо возврата значения, и все остается «в такт». Поэтому я предполагаю, что здесь может быть то же самое, но я все же хочу быть уверенным, что нет возможности повреждения стека или чего-то подобного (из-за того, что при завершении функции в стек ничего не помещается).
Согласно документам , revert
код операции действительно что-то возвращает.
Но я не уверен, что revert
функция работает, и даже если да, она не обязательно будет того же типа, что и в моей функции ( bool
в данном случае).
Итак... мне есть о чем беспокоиться, или выброшенное исключение "заботится" о возвращаемом значении?
Спасибо!
Обычно revert
всплывает и отменяет всю транзакцию, поэтому вам не нужно беспокоиться о неправильных возвращаемых значениях - вся транзакция завершится ошибкой . Невозможно перехватить такое исключение и, следовательно, невозможно предотвратить его возникновение, если код выдает файл revert
.
Есть несколько незначительных исключений из этого правила, а именно delegatecall
и аналогичные функции. Вы можете узнать больше об этом поведении (и о возврате в целом) по адресу: https://solidity.readthedocs.io/en/v0.4.24/control-structures.html#error-handling-assert-require-revert-and-exceptions .