Wir versuchen herauszufinden, ob return
oder throw
in Solidity verwendet werden soll, wenn eine Bedingung fehlschlägt, und wir gehen nicht von einer Böswilligkeit des Benutzers aus. Hier sind die Vor- und Nachteile, die wir bisher herausgefunden haben:
throw
throw
und den Benutzer warnenreturn
throw
.Gibt es weitere Überlegungen (oder Best Practices), die wir beachten sollten?
Alle Überlegungen in der Frage sind hilfreich.
throw
ist sicherer, da es sicherstellt, dass keine Nebenwirkungen verbleiben, aber eine weitere Überlegung ist die Fehlerberichterstattung. Mit throw
gibt es derzeit keine Möglichkeit, mehr Informationen über den Fehler zu erhalten, während Ereignisse und Fehlercodes verwendet werden könnten return
, um einen genaueren Grund für den Fehler zu vermitteln.
Eine weitere Sache, die Sie bei der Verwendung von web3.js beachten sollten, ist, dass throw
web3.js derzeit ein Problem mit false
values hat, wenn ein Solidity auftritt .
BEARBEITEN: Da throw
das gesamte Gas verbraucht wird, behalten Sie die EIP 140 REVERT-Anweisung im Auge :
Die
REVERT
Anweisung bietet eine Möglichkeit, die Ausführung zu stoppen und Zustandsänderungen rückgängig zu machen, ohne das gesamte bereitgestellte Gas zu verbrauchen, und mit der Möglichkeit, einen Grund zurückzugeben.
Vielleicht möchten Sie auch überlegen, warum Sie throw / return nicht verwenden sollten:
Warum nicht Throw verwenden
Warum nicht die Rückgabe verwenden
contract.doSomeImportantCall()
kann zurückgeben false
, aber der Aufrufer hat stattdessen einen Wurf erwartet, sodass schlimme Dinge passieren können, wenn er den Rückgabewert nicht überprüft.returns (bool _successful, uint _result)
vsreturns (uint _result)
Es gibt wirklich keinen Konsens darüber, wie man Dinge richtig macht. Tatsächlich gibt es derzeit beispielsweise eine Debatte über Wurf vs. Rückschlag für transfer
die aktualisierte ERC20-Spezifikation.
Pablo Jabo
eth
throw
das gesamte Gas verbraucht wird, und ich habe die Klarstellung hinzugefügt. Andernfalls wird eine Ätherübertragung entweder mit athrow
oder rückgängig gemachtrevert
.Pablo Jabo
eth
throw
den gesendeten Ether zurück: ethereum.stackexchange.com/questions/2428/…Pablo Jabo
eth