使用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
相关产品推荐
相关产品推荐

