Solidez - Tratamento de Erros
O Solidity oferece várias funções para tratamento de erros. Geralmente, quando ocorre um erro, o estado é revertido para seu estado original. Outras verificações são para impedir o acesso não autorizado ao código. A seguir estão alguns dos métodos importantes usados no tratamento de erros -
assert(bool condition)- Caso a condição não seja atendida, essa chamada de método causa um opcode inválido e quaisquer alterações feitas no estado são revertidas. Este método deve ser usado para erros internos.
require(bool condition)- Caso a condição não seja atendida, esta chamada de método retorna ao estado original. - Este método deve ser usado para erros em entradas ou componentes externos.
require(bool condition, string memory message)- Caso a condição não seja atendida, esta chamada de método retorna ao estado original. - Este método deve ser usado para erros em entradas ou componentes externos. Ele fornece uma opção para fornecer uma mensagem personalizada.
revert() - Este método aborta a execução e reverte todas as alterações feitas no estado.
revert(string memory reason)- Este método aborta a execução e reverte todas as alterações feitas no estado. Ele fornece uma opção para fornecer uma mensagem personalizada.
Exemplo
Tente o código a seguir para entender como funciona o tratamento de erros no 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.
}
}
Quando reverter for chamado, ele retornará os dados hexadecimais conforme a seguir.
Resultado
0x08c379a0 // Function selector for Error(string)
0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data