求助:用户取消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
相关产品推荐
相关产品推荐

