Un error personalizado es una definición de error que se puede declarar y lanzar desde el contrato. Cuando se lanza un error, se incluyen su nombre y los datos relevantes asociados, permitiendo una mejor depuración y manejo de errores.
1. Eficiencia en gas:
revert
o require
.
2. Información detallada:
3. Reutilización:
error NombreError(parametro1 tipo, parametro2 tipo, ...);
pragma solidity ^0.8.4;
contract EjemploErrores {
error SaldoInsuficiente(address usuario, uint saldoDisponible, uint montoRequerido);
function retirarFondos(uint monto) public view {
uint saldo = 100; // Ejemplo de saldo
if (saldo < monto) {
revert SaldoInsuficiente(msg.sender, saldo, monto);
}
}
}
En este ejemplo:
SaldoInsuficiente
incluye información adicional sobre el usuario, el saldo disponible y el monto requerido.
revert SaldoInsuficiente(...)
lanza el error con los valores correspondientes.
require
y revert
tradicionales
require
con un mensaje de error
require(saldo >= monto, "Saldo insuficiente");
error SaldoInsuficiente(address usuario, uint saldoDisponible, uint montoRequerido);
revert SaldoInsuficiente(msg.sender, saldo, monto);
Ventaja clave:
contract Permisos {
address public owner;
error NoAutorizado(address usuario);
constructor() {
owner = msg.sender;
}
function soloPropietario() public view {
if (msg.sender != owner) {
revert NoAutorizado(msg.sender);
}
}
}
En este caso:
NoAutorizado
con la dirección del usuario no autorizado.
contract ValidacionParametros {
error ValorFueraDeRango(uint valorIngresado, uint limiteInferior, uint limiteSuperior);
function establecerValor(uint valor) public pure {
if (valor < 10 || valor > 100) {
revert ValorFueraDeRango(valor, 10, 100);
}
}
}
En este ejemplo:
contract Transferencias {
error TransferenciaFallida(address destinatario, uint monto);
function enviarFondos(address destinatario, uint monto) public payable {
if (!payable(destinatario).send(monto)) {
revert TransferenciaFallida(destinatario, monto);
}
}
}
TransferenciaFallida
con información sobre el destinatario y el monto.
1. Eficiencia en gas:
2. Legibilidad:
3. Depuración más sencilla:
1. Usa errores personalizados para condiciones críticas:
2. Incluye información relevante:
3. Evita el uso excesivo de cadenas de texto:
require
o revert
con errores personalizados.
1. Compatibilidad:
2. Lectura externa:
contract ContratoComplejo {
address public owner;
error NoAutorizado(address usuario);
error FondosInsuficientes(uint saldoDisponible, uint montoRequerido);
error OperacionNoPermitida(string razon);
constructor() {
owner = msg.sender;
}
function retirarFondos(uint monto) public view {
if (msg.sender != owner) {
revert NoAutorizado(msg.sender);
}
uint saldo = 100; // Ejemplo
if (saldo < monto) {
revert FondosInsuficientes(saldo, monto);
}
if (monto > 50) {
revert OperacionNoPermitida("No se pueden retirar más de 50 Ether");
}
}
}
En este contrato:
Para más información sobre los errores personalizados, consulta la documentación oficial de Solidity.
Jorge García
Fullstack developer