¿Existen patrones y prácticas bien resueltos para el manejo de errores en Solidity?

En el espíritu de ¿Existen patrones de almacenamiento sencillos y bien resueltos para Solidity? ...

¿Existen prácticas conocidas y probadas en batalla sobre cómo tratar los errores en grandes bases de código de Solidity?

Es común en la ingeniería de software tener una colección clara de nombres, códigos y descripciones de errores, generalmente implementados a través de enumeraciones. El único proyecto que he visto que se adhiere a esta versión rigurosa del manejo de errores es Compound , pero debe haber más. El código base de Compound es grande y está entretejido con otras sutilezas, como scripts de verificación formales, por lo que no es estrictamente la mejor implementación a la que referirse al responder esta pregunta.

Siento que esta pregunta es demasiado abstracta para ser respondida de manera significativa. ¿Qué es un error? ¿Es un error del usuario? ¿Error de configuración? ¿Problema de seguridad? ¿Valor de retorno? ¿Excepción?
Discrepo cortésmente. Es una pregunta amplia, pero también lo son muchas en este sitio web. Un patrón sólido para manejar errores en Solidity no debería importar si el error es un error de usuario, de configuración, de seguridad, etc. Estoy buscando consejos sobre cosas como si una biblioteca tiene sentido o no o cuál es la mejor sintaxis para implementar el enumeraciones
Puede ser difícil encontrar una persona que esté dispuesta a escribir una respuesta que cubra esto. Es probable que obtenga más respuestas si divide su pregunta en varias preguntas que son más fáciles de responder individualmente.
Bueno, puedo hacerlo yo mismo. No va en contra de las reglas de la comunidad abrir una pregunta con la intención de responderla más tarde si nadie más lo hace, ¿verdad? :)

Respuestas (1)

¡Solidity v0.8.4 al rescate!

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.4;

error Unauthorized();

contract VendingMachine {
    address payable owner = payable(msg.sender);

    function withdraw() public {
        if (msg.sender != owner) {
            revert Unauthorized();
        }

        owner.transfer(address(this).balance);
    }
    // ...
}

Observe la nueva y brillante errordeclaración en la línea 4. Este es un cambio de juego para Solidity: es más fácil trabajar con él, más eficiente en el consumo de combustible y más elegante que las cadenas de razón revertidas.