据我所知,在稳固性方面没有任何习惯的例外。唯一的例外是Out of Gas
。无论我们用契约代码编写throw
,它都会抛出out-of-gas
异常。
但是,有什么办法我可以抓住这个例外吗?我的意思是,当出现异常时,我是否可以执行一段代码?即使在使用geth控制台时,我也没有收到任何异常发生的通知。
我认为很有可能捕捉到这样的异常,因为Mist能够在异常发生时显示Intrinsic gas too low
错误消息,所以它一定是在某个地方处理了该异常。
编辑:
问题基本上是:
在发送事务之前,我们如何知道该事务将消耗所有所提供的气体?
我不是在问如何为我的交易提供足够的汽油,而是如何知道我的交易将耗尽汽油。
这样做的一种方法是发送事务,让它被挖掘,然后检查是否存在gasUsed=gasSend
,是否存在thow
use debug.traceTransaction
。
但是我想知道,如果不发送交易,我的事务是否会完成。在Mist中,每当我试图发送将遇到throw
语句的事务时,它都会在发送事务之前显示Intrinsic gas too low
。我也想从geth
那里做同样的事情。
发布于 2016-09-19 09:34:18
Solidity没有提供尝试/catch(对于Java/c#)那样的异常管理机制。
由于EVM代码无效,抛出消耗所有提供的气体终端,并恢复对当前合同执行所作状态的所有更改和对以太平衡的更改。这一概念旨在防止网络垃圾邮件。
在黄皮书中提到:
与合同创建一样,如果执行以一种例外的方式停止(即由于耗尽的气体供应、堆栈下流量、无效的跳转目的地或无效指令),则不向调用方退还任何气体,并且状态将恢复到平衡转移之前的点(即σ)。
作为“内在气体太低”的信息
迷雾在不执行任何代码的情况下检查气体的数量,它告诉您事务将失败,因为您没有提供足够的气体来执行事务。
发布于 2016-09-19 14:04:21
如果您想像Mist那样估计气体,可以调用这eth_estimateGas
:
进行调用或事务,该调用或事务不会添加到区块链中并返回使用过的气体,该气体可用于估计使用过的气体。
https://ethereum.stackexchange.com/questions/8714
复制相似问题