Requerir error de validación no funciona

Intenté usar el método require en solidity de la siguiente manera:

require(validate(personName),"Error: Invalid Person")

En este caso, estoy comprobando si una persona ya está agregada a mi lista de personas. De lo contrario, muestra el mensaje de error en la consola "Persona no válida". Ahora, mi problema es que cuando ejecuto la función con un nombre válido, no recibo ningún error. Pero en caso de que el nombre de la persona no sea válido, muestra:

Error: VM Exception while processing transaction: revert
    at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:509:1)
    at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:354:1)
    at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/webpack:/~/xhr2/lib/xhr2.js:64:1)
    at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/httpprovider.js:128:1)
    at /usr/local/lib/node_modules/truffle/build/webpack:/packages/truffle-provider/wrapper.js:134:1
    at /usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/requestmanager.js:86:1
    at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/webpack:/~/web3/lib/web3/errors.js:

en lugar de mostrar "Error: Persona no válida". ¿Alguien puede decirme qué estoy haciendo mal aquí?

Respuestas (2)

Usted malinterpreta lo que revert()hace.

Lanzará una excepción si la expresión se evalúa como falsa.

La posibilidad de agregar una explicación ha estado surgiendo a través de la pila desde el lanzamiento de Byzantium. Esto es compatible con el nivel de EVM y el nivel del compilador de solc, por lo que puede incluir con éxito la explicación del error en sus contratos.

Espero eso ayude.

Entonces, ¿qué debo usar para mostrar un mensaje de error al usuario (actualmente estoy usando la consola de trufas. No he conectado mis contratos al front-end)
Del lado del cliente, puede .catch(...la excepción e inferir la razón o simplemente manejarla como una falla. Eche un vistazo a la idea de Shawn sobre Truffle 5 beta. Hay mejores opciones en camino.

El soporte para "cadenas de razón" para errores de reversión está disponible en la versión 5 de Truffle, que actualmente se encuentra en versión beta.

¡Revertir con cadenas de razón! Descubre el motivo.

Al usar esto, debería poder escribir pruebas que verifiquen la razón específica por la cual una función se revirtió, en lugar de capturar un error general.