Excepciones personalizadas en Solidity

En solidez, ¿hay alguna forma de lanzar custom Exceptionsmensajes de error? Estoy usando throwpara evitar una mayor ejecución de mi código, pero esto siempre da como resultado invalid JUMP(en la consola geth, en la depuración) y Intrinsic gas too low(en Mist). ¿Puedo tener mensajes de error personalizados?
Por ejemplo, ¿podemos modificar la transfer(..)función para generar un mensaje de error account balance is lowcuando el saldo del remitente es menor que la cantidad que desea transferir?

 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  

}

Respuestas (3)

Actualmente no hay excepciones personalizadas en el código de la máquina virtual de Ethereum. Todas las condiciones de falla son "sin gas", ya que la excepción se modela consumiendo todo el gas restante.

La API eth.debug.traceTransaction puede brindarle una idea , pero no implementa mecanismos de error legibles por humanos en este momento, que yo sepa.

Técnicamente, throwda como resultado un error de "salto no válido", no un error de falta de gas, pero el resultado es el mismo.
Eso es extraño. Me refiero a que sea cual sea el motivo de la falla de la transacción, el usuario siempre obtendrá Invalid Jump. Se vuelve bastante desagradable para nuestros usuarios.
@PrashantPrabhakarSingh: Este es un problema conocido. El protocolo original se desarrolló teniendo en cuenta la simplicidad y creo que las futuras versiones de Ethereum abordarán esto.
Tenga en cuenta que esta es la respuesta de 2016.

Desde solidity 0.4.22, es posible agregar mensajes de error con requirey assert. throwes obsoleto. Tomó mucho tiempo, pero finalmente es posible agregar una declaración de error. referencia

Un contrato de muestra que usa esto se ilustra como:

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;
    }
}

No estoy seguro de cómo detectar este mensaje de error en DAPP y mostrar el mensaje de error en la interfaz de usuario. Actualizaré la respuesta cuando haya explorado eso.

A partir de ahora puedes arrojar un error como este. No estoy seguro de cuándo se agregó:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

/// Write custom Error!
error MyCustomError();

Son 3 "///". "¡Escribir error personalizado!" es el mensaje que se le mostrará al usuario

entonces llámalo en tu función

   if (thisIsNotSatisfied){
          revert MyCustomError()
      }