# Solidity极简入门: 15.异常 **Published by:** [0xAA](https://paragraph.com/@wtfacademy/) **Published on:** 2022-04-21 **URL:** https://paragraph.com/@wtfacademy/solidity-15 ## Content 我最近在重新学solidity,巩固一下细节,也写一个“Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 欢迎关注我的推特:@0xAA_Science WTF技术社群discord,内有加微信群方法:链接 所有代码和教程开源在github(1024个star发课程认证,2048个star发社群NFT): github.com/AmazingAng/WTFSolidity这一讲,我们介绍solidity三种抛出异常的方法:error,require和assert,并比较三种方法的gas消耗。异常写智能合约经常会出bug,solidity中的异常命令帮助我们debug。ErrorError是solidity 0.8版本新加的内容,方便且高效(省gas)的向用户解释操作失败的原因。人们可以在contract之外定义异常。下面,我们定义一个TransferNotOwner异常,当用户不是代币owner的时候尝试转账,会抛出错误:error TransferNotOwner(); // 自定义error 在执行当中,error必须搭配revert(回退)命令使用。 function transferOwner1(uint256 tokenId, address newOwner) public { if(_owners[tokenId] != msg.sender){ revert TransferNotOwner(); } _owners[tokenId] = newOwner; } 我们定义了一个transferOwner1()函数,他会检查代币的owner是不是发起人,如果不是,就会抛出TransferNotOwner异常;如果是的话,就会转账。Requirerequire命令是solidity 0.8版本之前抛出异常的常用方法,目前很多主流合约仍然还在使用它。他很好用,唯一的缺点就是gas随着描述异常的字符串长度增加,比error命令要高。使用方法:require(检查条件,”异常的描述”),当检查条件不成立的时候,就会抛出异常。 我们用require命令重写一下上面的transferOwner函数: function transferOwner2(uint256 tokenId, address newOwner) public { require(_owners[tokenId] == msg.sender, "Transfer Not Owner"); _owners[tokenId] = newOwner; } Assertassert命令一般用于程序员写程序debug,因为他不能解释抛出异常的原因(比require少个字符串)。他的用法很简单,assert(检查条件),当检查条件不成立的时候,就会抛出异常。 我们用assert命令重写一下上面的transferOwner函数: function transferOwner3(uint256 tokenId, address newOwner) public { assert(_owners[tokenId] == msg.sender); _owners[tokenId] = newOwner; } 三种方法的gas比较我们比较一下三种抛出异常的gas消耗,方法很简单,部署合约,分别运行写的transferOwner函数的三个版本。error方法gas消耗:24445require方法gas消耗:24743assert方法gas消耗:24446我们可以看到,error方法gas cost最少,其次是assert,require方法消耗gas最多!因此,error既可以告知用户抛出异常的原因,又能省gas,大家要多用!总结这一讲,我们介绍solidity三种抛出异常的方法:error,require和assert,并比较了三种方法的gas消耗。结论:error既可以告知用户抛出异常的原因,又能省gas。 ## Publication Information - [0xAA](https://paragraph.com/@wtfacademy/): Publication homepage - [All Posts](https://paragraph.com/@wtfacademy/): More posts from this publication - [RSS Feed](https://api.paragraph.com/blogs/rss/@wtfacademy): Subscribe to updates - [Twitter](https://twitter.com/0xAA_Science): Follow on Twitter