Ich habe das folgende Stück Code:
function func() public returns (bool) {
if (some condition on msg.sender) {
do some stuff
return true;
}
revert();
}
Der Compiler (0.4.24) gibt keine Warnung darüber aus, obwohl nicht alle Ausführungspfade einen Wert zurückgeben.
Natürlich könnte ich revert()
gleich am Anfang anrufen (mit einer entgegengesetzten Bedingung) und dieses Problem vermeiden, aber aus internen Überlegungen zum Codierungsstil bevorzuge ich es wie oben gezeigt.
Jetzt weiß ich, dass zum Beispiel in C++ eine Funktion eine Ausnahme werfen kann, anstatt einen Wert zurückzugeben, und alles bleibt "im Takt". Ich nehme also an, dass es hier dasselbe sein könnte, aber ich möchte trotzdem sicher sein, dass kein Potenzial für Stapelbeschädigung oder ähnliches besteht (aufgrund der Tatsache, dass nichts in den Stapel geschoben wird, wenn die Funktion beendet wird).
Laut den Dokumenten gibt der revert
Opcode tatsächlich etwas zurück.
Aber ich bin mir nicht sicher, ob die revert
Funktion dies tut, und selbst wenn ja, wäre sie nicht unbedingt vom gleichen Typ wie in meiner Funktion ( bool
in diesem Fall).
Also ... muss ich mir hier Sorgen machen oder "kümmert" sich die ausgelöste Ausnahme um den zurückgegebenen Wert?
Danke schön!
In der Regel revert
wird die gesamte Transaktion aufgebläht und zurückgesetzt, sodass Sie sich keine Gedanken über falsche Rückgabewerte machen müssen - die gesamte Transaktion schlägt fehl. Es gibt keine Möglichkeit, diese Art von Ausnahme abzufangen , und daher kann sie nicht verhindert werden, wenn der Code eine revert
.
Es gibt einige geringfügige Ausnahmen von dieser Regel, nämlich delegatecall
und ähnliche Funktionalitäten. Weitere Informationen zu diesem Verhalten (und zum Zurücksetzen im Allgemeinen) finden Sie unter: https://solidity.readthedocs.io/en/v0.4.24/control-structures.html#error-handling-assert-require-revert-and-exceptions