Gibt es in der Solidität eine Möglichkeit, custom Exceptions
Fehlermeldungen mitzuwerfen? Ich verwende throw
, um die weitere Ausführung meines Codes zu verhindern, aber dies führt immer zu invalid JUMP
(in der Geth-Konsole, beim Debuggen) und Intrinsic gas too low
(in Mist). Kann ich benutzerdefinierte Fehlermeldungen haben?
Können wir zum Beispiel die transfer(..)
Funktion ändern, um eine Fehlermeldung zu erzeugen, account balance is low
wenn das Guthaben des Absenders geringer ist als der Betrag, den er überweisen möchte?
function transfer(address _to, uint256 _value) {
if (balanceOf[msg.sender] < _value) // Check if the sender has enough
{
throw;
// some code to display "account balance is low" to user instead of 'Intrinsic Gas too low'
}
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took
}
Derzeit gibt es keine benutzerdefinierten Ausnahmen im Code der virtuellen Maschine von Ethereum. Alle Ausfallbedingungen sind "kein Gas", da die Ausnahme so modelliert wird, dass sie das gesamte verbleibende Gas verbraucht.
eth.debug.traceTransaction API kann Ihnen einen Einblick geben , aber soweit ich weiß, implementiert es im Moment keine von Menschen lesbaren Fehlermechanismen.
Ab Solidity 0.4.22 ist es möglich, Fehlermeldungen mit require
und hinzuzufügen assert
. throw
ist veraltet. Es hat lange gedauert, aber endlich ist das Hinzufügen einer Fehlermeldung möglich. Referenz
Ein Mustervertrag, der dies verwendet, wird wie folgt dargestellt:
pragma solidity ^0.4.23;
contract TestExceptionHandling{
uint public a ;
constructor(uint _a) public{
a= _a;
}
function increaseA(uint b) public{
require(b > a, 'new value must be greater than a');
if (b > 50){
revert('Very large value');
}
a = b;
}
}
Ich bin mir nicht sicher, wie ich diese Fehlermeldung in DAPP abfangen und die Fehlermeldung auf der Benutzeroberfläche anzeigen kann. Ich werde die Antwort aktualisieren, wenn ich das untersucht habe.
Ab sofort können Sie einen Fehler wie diesen werfen. Ich bin mir nicht sicher, wann es hinzugefügt wurde:
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
/// Write custom Error!
error MyCustomError();
Es ist 3 "///". "Benutzerdefinierten Fehler schreiben!" ist die Nachricht, die dem Benutzer angezeigt wird
Rufen Sie es dann in Ihrer Funktion auf
if (thisIsNotSatisfied){
revert MyCustomError()
}
Tjaden Hess
throw
gesehen führt dies zu einem "Invalid Jump"-Fehler, nicht zu einem Gasmangel-Fehler, aber das Ergebnis ist dasselbe.Prashant Prabhakar Singh
Invalid Jump
. Wird für unsere Benutzer ziemlich unpraktisch.Mikko Ohtamaa
Mikko Ohtamaa