Solidity语言的错误检查提供了Require()、Revert()、Assert(),这三种方便的API调用,而这三种用途分别不同,毕竟牵涉到瓦斯费的问题,因此才会与过往的程序语言有些许的差异,

Require

require()通常会被使用在输入值的验证检查,因为它的特性主要是能够退回剩余的Gas fee,我们也知道瓦斯费在区块链的成本是昂贵的,因此这些检查都有助于不必要的浪费,主要使用方式为:

require(判断式,信息)

Revert

revert()顾名思义为撤销的意思,也就是通常不符合某些条件时则进行撤销,与reqiure一样是会退回剩余的Gas fee,那看到这边可能心里会产生一些疑问,比如说为什么不用require就好了呢两者语意事实上是有差异的。

require表述的是「必须要满足什么条件」。 revert则表述「当什么条件未被满足」时进行撤回。

另外revert使用的方式有以下三种:

revert CustomError(…) revert(”message”) revert()

刚开始可能会有些雾里看花,这么多不同的承接方式与参数,但撰写一段时间过后就会相当熟练,且在合适的时机使用正确的方式。

Assert

assert()跟require()一样,算是进行检核的机制,必须满足某些条件才能继续执行,但最大的差异在于当条件不满足时,会耗尽Gas fee,因此通常用来处理比较严重且不易发生的错误,例如边界值、特殊条件…等程序内部错误,也是最不常被使用的错误处理方法。

Try … Catch

相信这种语法如果有在开发其他程序的朋友应该非常熟悉,没错,Solidity亦提供这种错误处理机制,但值得注意的是在智能合约的世界中仅适合外部调用,白话来说就是A合约去尝试使用B合约的功能,语法结构主要为:

而错误的捕捉类型又分为以下四种方式,分别说明:

结语

原来一个简单的错误处理背后其实并不简单…,与「金钱」有关的产品或服务最重要的莫过于严谨的审查机制,因此很多错误都是不能被容忍的,故而错误处理的机制就显得非常重要,处理方式也相较于大部分程序语言有所不同,主要是因为纳入了Gas fee的缘故,以此为鉴,当开发者进行开发智能合约时的错误处理也要非常小心,哪个使用情境要用哪一种错误处理的技巧并且不浪费Gas fee的状况下,真的是对于智能合约开发者来说是一大挑战,相信我们只要读懂这些错误处理的概念后,未来开发时就会特别注意。