这有一些简便的logging(日志)工具,用于简化和标准化Ethers库中的error facilities。
Logger库没有依赖关系,并且非常轻量级,因此可以很容易地包含在每个库中。
审查(Censorship)功能依赖于包含的ether库的一个实例。在大型绑定包中或使用npm link
时,可能使用的方式就有所不同。 如果需要使用此功能,请确保你绑定的配置是正确的。
Logger
创建一个新的logger包含所有错误抛出的版本(version)。
打印 debugging 信息。
打印通用的信息。
打印 warnings 信息。
这些函数支持当前的审查(Censorship),还可以帮助创建一个用于检测和处理Ethers中的错误的标准错误模型。
创建一个带有消息(message)、可选代码(code)和附加参数集(params)的Error对象。用于需要拒绝错误而不是抛出错误时。
抛出一个带有消息(message)、可选代码(code)和附加参数集(params)的错误(Error)。
抛出一个带有名称(name )和值(value)的INVALID_ARGUMENT错误。
可以用来确保各种属性(properties)和行为(actions)是安全的。
如果target是kind,则抛出UNSUPPORTED_OPERATION错误, 否则执行与checkNew相同的操作。
这可以用来确保抽象类没有被实例化。
如果count不等于expectedCount,则抛出MISSING_ARGUMENT 或UNEXPECTED_ARGUMENT错误。
如果target不是有效的this
或target
值,则抛出MISSING_NEW错误。 这有助于确保类的调用者是使用new
关键字的。
检查运行环境(environment)是否具有正常运行String.normalize的功能。 如果没有,则抛出UNSUPPORTED_OPERATION错误。
如果value作为JavaScript number是不安全的,则抛出NUMERIC_FAULT错误。
设置错误审查(error censorship),可选地设置哪些错误可以被审查。
在生产应用程序中,这可以通过屏蔽错误的消息(message)和值(values)来防止错误泄露信息。
这可能会影响调试,使调试变得更加困难。
Ethers中的每个错误都有一个代码(code)
值,它是一个字符串,将匹配以下错误代码之一。
与服务器通信时发生错误。
出现这种情况的原因有很多,例如:
- CORS的问题;大多数都是这种问题,属于最难诊断和修复的,所以熟悉CORS对你是很有帮助的; 一些后端允许你配置你的CORS,例如geth命令行或配置文件,或者是INFURA和Alchemy的通过指定Origins或者methods配置的dashboards等。
- SSL的问题;例如,如果你试图通过HTTP连接到本地节点,但节点提供的是HTTPS网站的内容。
- 链接的问题;防火墙正在阻止进入服务器的流量。
- 服务器的问题;服务器已关闭,或返回500的错误码。
- 后端DDoS mitigation proxy问题;例如,Etherscan在Cloudflare代理后运行,如果请求是通过特定的用户代理发送的,或者在某些情况下,客户端fingerprint被检测为机器人,Cloudflare代理将阻塞流量
不支持该操作。
这种情况可能有多种原因,例如:
- 有些后端不支持某些操作;例如传递一个blockTag给EtherscanProvider调用
- 连接到Provider(而不是Signer)的合约(Contract) 对象不能sign或send交易
- 一个连接到Signer而没有Provider的合约(Contract)是只写的,不能估计gas或执行静态调用
所需的数据量大于规定的数据量,这将导致数据缓冲区读取超过其末端。
如果合约错误地返回无效的abi编码数据或RLP数据格式不正确,就会发生这种情况。
对数值进行了无效的操作。
这种情况通常发生在overflow、固定数值类型中的arithmetic underflow、或除零时。
参数的类型或值无效。这通常还包括参数的name
和value
。 任何接受敏感数据(如私钥)的函数将包含string"[[REDACTED]]"
而不是传入的值。
尝试调用区块链合约(getter)会导致revert或其他错误,例如gas不足(out-of-gas)或无效的操作码。 这也可能发生在gas估计或等待TransactionReceipt执行过程中失败。
通过合约来确定原因,例如require
语句中的失败条件。reason
属性可以为此错误的原因提供更多上下文。
该帐户正试图进行一个费用超过自身可用余额的交易。
发送帐户必须有足够的以太币来对value、gas limit、以及数据的内在成本进行支付。 数据的内在成本是每个零字节4个gas,每个非零字节68个gas,如果交易不包含to
属性,表示要部署一个新合约,则为35000个gas。
当替换一个交易(已经发送到网络但尚未被挖出)时,通过相同nonce,新的交易必须比指定替换的的gas price更高。
当天然气价格不足以贿赂(bribe)交易池(期望使其选择新的交易而不是旧的交易时)就会发生这种错误。 一般情况下,新的gas price应该是比原来多50% + 1 wei,即如果使用10 gwei的gas price, 更换的应该是15.000000001gwei。协议没有强制执行这一点,因为它处理未被挖出的交易可以由每个节点自由配置, 但是要确保将交易传播到一个矿工手里,最好是遵循大多数节点启用的默认值。
当一个交易被用户替换时,即广播的新交易替换了节点内存池中相同正在等待被打包的相同nonce的旧交易,就会发生此错误,因为 正在等待被打包的旧交易已经失效了。
这种情况可能有多种原因,但最常见的原因是用户提高了gas price(这改变了交易哈希)去"加速"交易, 或者用户在其客户端"取消"了交易。在任何一种情况下,这通常是通过以更高的gas price去贿赂矿工来实现的。
此错误将具有附加属性:cancelled
, hash
, reason
, receipt
和 replacement
。
有关更多详细信息,请参阅wait
方法的TransactionResponse。
在估计一个交易所需的gas数量时,查询一个节点以获得其最佳的预测值。
如果节点不能(或不愿意)预测成本值,则会发生此错误。
对于这种情况,最好的解决办法是在交易中手动指定一个gas limit。
该错误还会表明,如果一个没有token的帐户试图发送token,交易无论如何都将失败。
记录所有输出信息,包括调试信息。
仅记录信息、警告和错误的输出。
仅记录警告和错误的输出。
仅记录错误的输出。
不输出日志。