异常:写智能合约经常会出bug,solidity中的异常命令帮助我们debug。
Error:error是solidity 0.8版本新加的内容,方便且高效(省gas)地向用户解释操作失败的原因。人们可以在contract之外定义异常。下面,我们定义一个TransferNotOwner异常,当用户不是代币owner的时候尝试转账,会抛出错误:

在执行当中,error必须搭配revert(回退)命令使用。
Require:require命令是solidity 0.8版本之前抛出异常的常用方法,目前很多主流合约仍然还在使用它。它很好用,唯一的缺点就是gas随着描述异常的字符串长度增加,比error命令要高。使用方法:require(检查条件,"异常的描述"),当检查条件不成立的时候,就会抛出异常。我们用require命令重写一下上面的transferOwner函数:

Assert:assert命令一般用于程序员写程序debug,因为它不能解释抛出异常的原因(比require少个字符串)。它的用法很简单,assert(检查条件),当检查条件不成立的时候,就会抛出异常。我们用assert命令重写一下上面的transferOwner函数:

三种方法的gas比较:我们比较一下三种抛出异常的gas消耗,通过remix控制台的Debug按钮,能查到每次函数调用的gas消耗分别如下:error方法gas消耗:24445。require方法gas消耗:24743。assert方法gas消耗:24446。我们可以看到,error方法gas最少,其次是assert,require方法消耗gas最多!因此,error既可以告知用户抛出异常的原因,又能省gas,大家要多用!(注意,由于部署测试时间的不同,每个函数的gas消耗会有所不同,但是比较结果会是一致的。)
结论:error既可以告知用户抛出异常的原因,又能省gas。
我是温驭臣,一个Solidity的开发学习者,以上是我的简单总结,如果有缺陷,希望在评论区看到您的补充。
网友评论