En solidez, ¿hay alguna forma de lanzar custom Exceptions
mensajes de error? Estoy usando throw
para 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 low
cuando 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
}
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.
Desde solidity 0.4.22, es posible agregar mensajes de error con require
y assert
. throw
es 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()
}
tjaden hess
throw
da como resultado un error de "salto no válido", no un error de falta de gas, pero el resultado es el mismo.Prashant Prabhakar Singh
Invalid Jump
. Se vuelve bastante desagradable para nuestros usuarios.mikko ohtamaa
mikko ohtamaa