Benutzerdefinierte Ausnahmen in Solidity

Gibt es in der Solidität eine Möglichkeit, custom ExceptionsFehlermeldungen 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 lowwenn 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  

}

Antworten (3)

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.

Technisch throwgesehen führt dies zu einem "Invalid Jump"-Fehler, nicht zu einem Gasmangel-Fehler, aber das Ergebnis ist dasselbe.
Das ist merkwürdig. Ich meine, was auch immer der Grund für das Scheitern der Transaktion ist, der Benutzer wird immer Invalid Jump. Wird für unsere Benutzer ziemlich unpraktisch.
@PrashantPrabhakarSingh: Dies ist ein bekanntes Problem. Das ursprüngliche Protokoll wurde im Hinblick auf Einfachheit entwickelt, und ich glaube, dass die zukünftigen Ethereum-Versionen dies ansprechen werden.
Bitte beachten Sie, dass dies die Antwort von 2016 ist.

Ab Solidity 0.4.22 ist es möglich, Fehlermeldungen mit requireund hinzuzufügen assert. throwist 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()
      }