Мы пытаемся выяснить, следует ли использовать return
или throw
в Solidity, когда условие не выполняется, и мы не предполагаем злонамеренность пользователя. Вот плюсы и минусы, которые мы выяснили до сих пор:
throw
throw
заранее, предупреждая пользователяreturn
throw
.Есть ли какие-либо другие соображения (или лучшие практики), о которых нам следует знать?
Все соображения в вопросе полезны.
throw
безопаснее, поскольку гарантирует отсутствие побочных эффектов, но еще одним соображением является отчет об ошибках. Поскольку throw
в настоящее время нет способа получить дополнительную информацию об ошибке, в то время как события и коды ошибок можно использовать return
для передачи более детальной информации о причине ошибки.
Еще одна вещь, о которой следует помнить при использовании web3.js, заключается в том, что когда встречается Solidity throw
, в настоящее время web3.js имеет проблему со false
значениями .
РЕДАКТИРОВАТЬ: поскольку throw
потребляет весь газ, следите за инструкцией EIP 140 REVERT :
Инструкция
REVERT
предоставляет способ остановить выполнение и отменить изменения состояния, не потребляя весь предоставленный газ и с возможностью возврата причины.
Вы также можете подумать, почему бы не использовать throw/return:
Почему бы не использовать бросок
Почему бы не использовать возврат
contract.doSomeImportantCall()
может return false
, но вместо этого вызывающий объект ожидал бросок, поэтому, если он не проверит возвращаемое значение, могут произойти плохие вещи.returns (bool _successful, uint _result)
vsreturns (uint _result)
На самом деле нет единого мнения о том, как правильно поступать. На самом деле, в настоящее время ведутся дебаты по поводу броска или возврата transfer
, например, для обновленной спецификации ERC20.
Пабло Ябо
эт
throw
потребляет весь газ, и я добавил уточнение. В противном случае передача эфира отменяется с помощью athrow
илиrevert
.Пабло Ябо
эт
throw
откатывает отправленный эфир: ethereum.stackexchange.com/questions/2428/…Пабло Ябо
эт