Solidez – Manejo de errores

Solidity tiene muchas funciones para el manejo de errores. Los errores pueden ocurrir en tiempo de compilación o en tiempo de ejecución. Solidity se compila en código de bytes y allí se verifica un error de sintaxis en tiempo de compilación, mientras que los errores de tiempo de ejecución son difíciles de detectar y ocurren principalmente durante la ejecución de los contratos. Algunos de los errores de tiempo de ejecución son error de falta de gas, error de desbordamiento de tipo de datos, error de división por cero, error de array fuera de índice, etc. para manejar errores múltiples declaraciones if…else, uno tiene que implementar para verificar los valores y arrojar errores que consumen más gas. Después de la versión 4.10, se introdujeron nuevas declaraciones de manejo de errores , afirmar, requerir, revertir y el lanzamiento se hizo absoluto.

Requerir declaraciones

Las declaraciones ‘require’ declaran los requisitos previos para ejecutar la función, es decir, declara las restricciones que deben cumplirse antes de ejecutar el código. Acepta un solo argumento y devuelve un valor booleano después de la evaluación, también tiene una opción de mensaje de string personalizada. Si es falso, se genera una excepción y finaliza la ejecución. El gas no utilizado se devuelve a la persona que llama y el estado se invierte a su estado original. Los siguientes son algunos casos en los que se activa el tipo de excepción requerida:

  • Cuando se llama a require() con los argumentos que resultan falsos.
  • Cuando una función llamada por un mensaje no finaliza correctamente.
  • Cuando se crea un contrato con la nueva palabra clave y el proceso no finaliza correctamente.
  • Cuando un contrato sin código está destinado a una función externa.
  • Cuando se envían éteres al contrato mediante el método de obtención pública.
  • Cuando el método .transfer() falla.
    • Cuando se llama a una afirmación con una condición que da como resultado falso.
    • Cuando se llama a una variable inicializada en cero de una función.
    • Cuando un valor grande o negativo se convierte en una enumeración.
    • Cuando un valor se divide o módulo por cero.
    • Al acceder a una array en un índice que es demasiado grande o negativo.

Ejemplo: En el siguiente ejemplo, el contrato requireStatement demuestra cómo usar la ‘declaración requerida’.

Solidity

// Solidity program to demonstrate require statement
pragma solidity ^0.5.0;
 
// Creating a contract
contract requireStatement {
    
    // Defining function to check input
    function checkInput(uint _input) public view returns(string memory){
        require(_input >= 0, "invalid uint8");
        require(_input <= 255, "invalid uint8");
         
        return "Input is Uint8";
    }
    
    // Defining function to use require statement
    function Odd(uint _input) public view returns(bool){
        require(_input % 2 != 0);
        return true;
    }
}

Producción :  

Require Statement

Declaración de afirmación 

Su sintaxis es similar a la instrucción require. Devuelve un valor booleano después de la evaluación de la condición. Según el valor de retorno, el programa continuará su ejecución o generará una excepción. En lugar de devolver el gas no utilizado, la declaración de afirmación consume todo el suministro de gas y luego el estado se invierte al estado original. Assert se utiliza para verificar el estado actual y las condiciones de funcionamiento antes de la ejecución del contrato. A continuación se muestran algunos casos con excepciones de tipo de aserción:

  • Cuando se llama a una afirmación con una condición que da como resultado falso.
  • Cuando se llama a una variable inicializada en cero de una función.
  • Cuando un valor grande o negativo se convierte en una enumeración.
  • Cuando un valor se divide o módulo por cero.
  • Al acceder a una array en un índice que es demasiado grande o negativo.

Ejemplo: En el siguiente ejemplo, la Declaración de afirmación del contrato demuestra cómo usar una ‘declaración de afirmación’. 

Solidity

// Solidity program to demonstrate assert statement
pragma solidity ^0.5.0;
 
// Creating a contract
contract assertStatement {
   
    // Defining a state variable 
    bool result;
 
    // Defining a function to check condition
    function checkOverflow(uint _num1, uint _num2) public {
        uint sum = _num1 + _num2;
        assert(sum<=255);
        result = true;
    }
    
    // Defining a function to print result of assert statement
    function getResult() public view returns(string memory){
         if(result == true){
             return "No Overflow";
         }
         else{
             return "Overflow exist";
         }
    }
}

 Producción :  

Assert Statement

Revertir Declaración

Esta sentencia es similar a la sentencia require. No evalúa ninguna condición y no depende de ningún estado o declaración. Se utiliza para generar excepciones, mostrar errores y revertir la llamada de función. Esta declaración contiene un mensaje de string que indica el problema relacionado con la información de la excepción. Llamar a una declaración de reversión implica que se lanza una excepción, se devuelve el gas no utilizado y el estado vuelve a su estado original. Revert se usa para manejar los mismos tipos de excepción que los manejadores de requisitos, pero con una lógica un poco más compleja.

Ejemplo: En el siguiente ejemplo, el contrato revertStatement demuestra la ‘declaración de reversión’. 

Solidity

// Solidity program to demonstrate revert statement
pragma solidity ^0.5.0;
 
// Creating a contract
contract revertStatement {
   
   // Defining a function to check condition
   function checkOverflow(uint _num1, uint _num2) public view returns(string memory, uint){
        uint sum = _num1 + _num2;
         if(sum < 0 || sum > 255){
             revert(" Overflow Exist");
         }
         else{
             return ("No Overflow", sum);
         }
          
    }
     
}
     
}

Producción :  

Revert StatementRevert Statement

Publicación traducida automáticamente

Artículo escrito por jeeteshgavande30 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *