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

使用web3-react如何捕获以太坊智能合约自定义异常?

捕获智能合约具体错误的方法

1. 提取错误对象中的具体提示

web3.js 会把合约 require 抛出的错误封装在 ContractExecutionError 实例中,但具体的错误文本藏在错误对象的 reason 属性里(部分旧版本可能存于 data.message 中)。你只需用 try-catch 包裹调用逻辑,在捕获时直接读取该字段:

try {
  await contract.methods
    .createSector(
      web3.utils.toBigInt(selectedCells[0].globalI),
      web3.utils.toBigInt(selectedCells[0].globalJ),
      web3.utils.toBigInt(1),
      web3.utils.toBigInt(1),
      { value: cellPriceInWei } // 单位问题下文说明
    )
    .send({ from: account.address });
} catch (error) {
  // 优先取reason,取不到则尝试读取data中的消息
  const realError = error.reason || error.data?.message || '未知错误';
  console.error('合约执行报错:', realError);
  // 将realError展示给前端UI即可
}

2. 修正代码中的金额单位错误

你当前代码里的 value 参数设置存在逻辑错误:web3.utils.fromWei(cellPriceInWei, 'ether') 是把 wei 单位的数值转换为 ether,但 send 方法的 value 参数要求传入 wei 单位的数值。这会导致你实际传入的金额远小于合约要求的价格,直接触发 Insufficient funds 错误。

正确写法分两种情况:

  • 如果 cellPriceInWei 本身就是 wei 类型的数值(比如从合约中获取的 price),直接传入 { value: cellPriceInWei } 即可
  • 如果你的金额是 ether 格式(比如用户输入的 1.5 ETH),才需要用 web3.utils.toWei(amount, 'ether') 转换为 wei 单位

3. 确认Ganache配置有效性

Ganache 默认会返回合约抛出的具体错误信息,若你之前修改过Ganache配置,可以检查一下设置,确保没有禁用错误详情的返回功能。

内容的提问来源于stack exchange,提问作者Joey Yi Zhao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:42:28