捕获web3.TransactionNotFound异常失败,求解决方法
解决Web3 TransactionNotFound异常捕获失败的问题
问题原因分析
你遇到的问题核心原因有两点:
- 第一种捕获方式报错
NameError,是因为未导入TransactionNotFound异常类,Python无法识别这个未定义的名称。 - 后两种方式无效,大概率是异常匹配顺序错误、模块导入不完整,或者异常被上层代码提前拦截。
正确的捕获方案
方案1:导入异常类后直接捕获
先从web3.exceptions中导入目标异常类,再在except块中使用:
from web3 import Web3 from web3.exceptions import TransactionNotFound # 初始化Web3实例 w3 = Web3(Web3.HTTPProvider("你的节点URL")) try: # 执行可能抛出异常的操作,例如查询交易 tx = w3.eth.get_transaction("0xb5f2ffa5e1d79e7cf5bee4892f75303db227554c322fa32c1e97026915b740a8") except TransactionNotFound as error: print(f"交易未找到: {error}") # 通用异常捕获必须放在具体异常之后 except Exception as error: print(f"其他异常: {error}")
方案2:使用完整模块路径捕获
如果不想单独导入异常类,直接通过web3.exceptions的完整路径引用:
import web3 w3 = web3.Web3(web3.Web3.HTTPProvider("你的节点URL")) try: tx = w3.eth.get_transaction("0xb5f2ffa5e1d79e7cf5bee4892f75303db227554c322fa32c1e97026915b740a8") except web3.exceptions.TransactionNotFound as error: print(f"交易未找到: {error}") except Exception as error: print(f"其他异常: {error}")
无效情况的排查步骤
如果以上方案仍无效,按以下步骤排查:
- 确认实际抛出的异常类型:在通用
except块中打印异常类型,验证是否确实是TransactionNotFound:try: # 你的业务代码 except Exception as error: print(f"实际异常类型: {type(error)}") print(f"异常信息: {error}") - 检查异常拦截顺序:确保具体异常捕获块放在通用异常块之前,Python会匹配第一个符合条件的
except块,若通用块在前,会直接拦截所有异常。 - 验证Web3模块导入正确性:确保
web3模块已正确安装且导入方式无误,避免因导入不完整导致无法识别异常类。
不推荐的方案
不要通过字符串匹配异常信息(你尝试的第三种方法),这种方式非常不可靠:不同Web3版本的异常文本可能存在差异,且异常对象的字符串比较容易因格式细节(如空格、引号)失效。
内容的提问来源于stack exchange,提问作者kAramelniy
相关产品推荐
相关产品推荐

