WTF Solidity極簡入門第十五講:異常

這篇文章介紹了Solidity中三種拋出異常的方法:error、require和assert,並比較它們的gas消耗。以下是核心要點:

  • Error:Solidity 0.8版本新增的功能,高效且省gas,需搭配revert使用,適合定義特定異常情況(如非擁有者轉賬)。
  • Require:傳統拋出異常方法,可附加描述字符串,但gas消耗較高,適合條件檢查。
  • Assert:主要用於debug,無法提供異常描述,gas消耗介於error和require之間。

比較結果顯示,error的gas消耗最低(24445),其次是assert(24446),require最高(24743)。因此,建議優先使用error,既能明確異常原因又能節省gas。文章還提供了相關代碼示例和開源資源連結。

總結

原文: 《Solidity 極簡入門: 15. 異常》

我最近在重新學solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每週更新1-3 講。

所有代碼和教程開源在github:github.com/AmazingAng/WTFSolidity

這一講,我們介紹solidity 三種拋出異常的方法:error,require 和assert,並比較三種方法的gas 消耗。

異常

寫智能合約經常會出bug,solidity 中的異常命令幫助我們debug。

Error

Error 是solidity0.8 版本新加的內容,方便且高效(省gas)的向用戶解釋操作失敗的原因。人們可以在contract 之外定義異常。下面,我們定義一個TransferNotOwner 異常,當用戶不是代幣owner 的時候嘗試轉賬,會拋出錯誤:

WTF Solidity極簡入門第十五講:異常

在執行當中,error 必須搭配revert(回退)命令使用。

WTF Solidity極簡入門第十五講:異常

我們定義了一個transferOwner1() 函數,他會檢查代幣的owner 是不是發起人,如果不是,就會拋出TransferNotOwner 異常;如果是的話,就會轉賬。

Require

require 命令是solidity0.8 版本之前拋出異常的常用方法,目前很多主流合約仍然還在使用它。他很好用,唯一的缺點就是gas 隨著描述異常的字符串長度增加,比error 命令要高。使用方法:require(檢查條件,」異常的描述」),當檢查條件不成立的時候,就會拋出異常。

我們用require 命令重寫一下上面的transferOwner 函數:

WTF Solidity極簡入門第十五講:異常

Assert

assert 命令一般用於程序員寫程序debug,因為他不能解釋拋出異常的原因(比require 少個字符串)。他的用法很簡單,assert(檢查條件),當檢查條件不成立的時候,就會拋出異常。

我們用assert 命令重寫一下上面的transferOwner 函數:

WTF Solidity極簡入門第十五講:異常

三種方法的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。

推特: @0xAA_Science

社區: Discord微信群官網wtf.academy

所有代碼和教程開源在github: github.com/AmazingAng/WTFSolidity

分享至:

作者:0xAA

本文為PANews入駐專欄作者的觀點,不代表PANews立場,不承擔法律責任。

文章及觀點也不構成投資意見

圖片來源:0xAA如有侵權,請聯絡作者刪除。

關注PANews官方賬號,一起穿越牛熊
推薦閱讀
37分鐘前
4小時前
6小時前
2025-12-13 09:23
2025-12-13 07:30
2025-12-13 05:30

熱門文章

行業要聞
市場熱點
精選讀物

精選專題

App内阅读