如何在智能合约上捕获异常?

How can catch exception on Smart Contract?

您好,先谢谢您了!

const comprarCapsula = () => {
    const compraCapsula = async () => {

        console.log("Iniciando transacción...");
        // ------------------------
        const pago = web3.utils.toWei(precioFinal.toString(), 'ether');
        // Mensaje de información
        infoAlert();
        // Petición al SC
        const transaction = await contract.myFunction(cantidad, {
            from: props.currentAccount,
            value: pago.toString()}
        ).then((result) => {
            console.log("RESULT:", result);
            successAlert(result.tx);
        }).catch((error) => {
            console.error("TESTING: ", error.message);
            errorAlert(error.message);
        });
        console.log("TRANS: ", transaction);
        // ------------------------
    }

    contract && compraCapsula()
}

我的应用程序检测到我何时使用 MetaMask 取消操作(错误),但如果智能合约抛出错误它不会被捕获。

MetaMask - RPC Error: Internal JSON-RPC error. 
Object { code: -32603, message: "Internal JSON-RPC error.", data: {…} }
Data: Object { code: 3, message: "execution reverted: Exception: must have minter role to mint"

在我的智能合约中出现错误“必须有铸造者角色才能铸造”。

为什么?我正在尝试多种方法来收集 Metamask 抛出的 RPC 错误,但我找不到方法。

你能检查一下这样调用你的合约函数吗:

contract.myFunction.call

而不是

contract.myFunction

我在开发合约的时候遇到了类似的问题。 call 可用于查看函数是否会抛出错误 - 特别是结构性、修饰符检查明智 - 但仅使用 call 不会调用函数的完整行为。使用 call 检查错误后,您可以再次调用该函数。

使用 call 的函数调用使我们能够捕获此类错误。我当时用了这样一个结构:

await contract.myFunction.call(`parameters...`)
     .then(
            contract.myFunction(`parameters...`)
      )