You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用户取消MetaMask交易时无法捕获错误的解决方案

解决方案

首先注意代码里的拼写错误:helloWrold应该修正为helloWorld,避免因方法名错误导致调用失败。

针对用户取消MetaMask交易时错误处理器不执行的问题,有两种可靠解决方式:

方式一:使用async/await配合try/catch

send()方法返回的是Promise,用async函数包裹后,用户取消交易的错误会被catch块捕获:

const userAccount = '0x...';

async function invokeHelloWorld() {
  try {
    const receipt = await this.contract.methods
      .helloWorld('some parameter 1', 'some parameter 2')
      .send({ from: userAccount });
    console.log('Transaction success:', receipt);
  } catch (error) {
    // MetaMask用户取消交易的错误码固定为4001,可针对性处理
    if (error.code === 4001) {
      console.error('用户取消了交易');
    } else {
      console.error('Transaction error:', error);
    }
  }
}

invokeHelloWorld();

方式二:给交易Promise添加catch回调

在已有的事件监听之外,直接调用catch()方法捕获Promise的rejection,覆盖用户取消交易的场景:

const userAccount = '0x...';

const transaction = this.contract.methods
  .helloWorld('some parameter 1', 'some parameter 2')
  .send({ from: userAccount });

transaction.on('error', (error) => {
  console.error('Transaction error:', error);
});

transaction.on('receipt', (receipt) => {
  console.log('Transaction success:', receipt);
});

// 捕获用户取消交易这类Promise拒绝情况
transaction.catch((error) => {
  if (error.code === 4001) {
    console.error('用户取消了交易');
  } else {
    console.error('未捕获的交易错误:', error);
  }
});

原因说明

MetaMask用户取消交易时,会抛出错误码为4001的异常,这个异常属于Promise的rejection。部分Web3.js版本中,error事件不会触发这种用户主动取消的情况,因此需要通过Promise的catch()或者async/await的try/catch来捕获。

内容的提问来源于stack exchange,提问作者Sergej

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 08:13:23