Solidez - Manejo de errores

Solidity proporciona varias funciones para el manejo de errores. Generalmente, cuando ocurre un error, el estado se revierte a su estado original. Otras verificaciones son para evitar el acceso no autorizado al código. A continuación se muestran algunos de los métodos importantes utilizados en el manejo de errores:

  • assert(bool condition)- En caso de que la condición no se cumpla, esta llamada al método provoca un código de operación no válido y cualquier cambio realizado en el estado se revierte. Este método se debe utilizar para errores internos.

  • require(bool condition)- En caso de que no se cumpla la condición, esta llamada al método vuelve al estado original. - Este método se debe utilizar para errores en entradas o componentes externos.

  • require(bool condition, string memory message)- En caso de que no se cumpla la condición, esta llamada al método vuelve al estado original. - Este método se debe utilizar para errores en entradas o componentes externos. Proporciona una opción para proporcionar un mensaje personalizado.

  • revert() - Este método aborta la ejecución y revierte cualquier cambio realizado en el estado.

  • revert(string memory reason)- Este método aborta la ejecución y revierte cualquier cambio realizado en el estado. Proporciona una opción para proporcionar un mensaje personalizado.

Ejemplo

Pruebe el siguiente código para comprender cómo funciona el manejo de errores en Solidity.

pragma solidity ^0.5.0;

contract Vendor {
   address public seller;
   modifier onlySeller() {
      require(
         msg.sender == seller,
         "Only seller can call this."
      );
      _;
   }
   function sell(uint amount) public payable onlySeller { 
      if (amount > msg.value / 2 ether)
         revert("Not enough Ether provided.");
      // Perform the sell operation.
   }
}

Cuando se llama a revertir, devolverá los datos hexadecimales como se indica a continuación.

Salida

0x08c379a0                     // Function selector for Error(string)
0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data