Solidity極簡入門|第三十講:Try Catch
BlockBeats 律動財經 2022-10-17 22:00
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每周更新 1-3 講。
所有代碼和教程開源在 github:github.com/AmazingAng/WTFSolidity
try-catch 是現代編程語言幾乎都有的處理異常的一種標準方式,solidity0.6 版本也添加了它。這一講,我們將介紹如何利用 try-catch 處理智能合約中的異常。
try-catch
在 solidity 中,try-catch 只能被用於 external 函數或創建合約時 constructor(被視為 external 函數)的調用。基本語法如下:
其中 externalContract.f() 時某個外部合約的函數調用,try 模塊在調用成功的情況下運行,而 catch 模塊則在調用失敗時運行。
如果調用的函數有返回值,那麼必須在 try 之後聲明 returns(returnType val),並且在 try 模塊中可以使用返回的變量;如果時創建合約,那麼返回值是新創建的合約變量。
另外,catch 模塊支持捕獲特殊的異常原因:
try-catch 實戰
OnlyEven
我們創建一個外部合約 OnlyEven,並使用 try-catch 來處理異常:
OnlyEven 合約包含一個構造函數和一個 onlyEven 函數。
構造函數有一個參數 a,當 a=0 時,require 會拋出異常;當 a=1 時,assert 會拋出異常;其他情況均正常。onlyEven 函數有一個參數 b,當 b 為奇數時,require 會拋出異常。
處理外部函數調用異常
首先,在 TryCatch 合約中定義一些事件和狀態變量:
SuccessEvent 是調用成功會釋放的事件,而 CatchEvent 和 CatchByte 是拋出異常時會釋放的事件,分別對應 require/revert 和 assert 異常的情況。even 是個 OnlyEven 合約類型的狀態變量。
然後我們在 execute 函數中使用 try-catch 處理調用外部函數 onlyEven 中的異常:
當運行 execute(0) 的時候,因為 0 為偶數,沒有異常拋出,調用成功並釋放 SuccessEvent 事件;當運行 execute(1) 的時候,因為 1 為偶數,異常拋出,調用失敗並釋放 CatchEvent 事件。
處理合約創建異常
這裡,我們利用 try-catch 來處理合約創建時的異常。只需要把 try 模塊改寫為 OnlyEven 合約的創建就行:
大家可以運行一下 executeNew(0),executeNew(1),executeNew(2),看看會有什麼不同。
總結
在這一講,我們介紹了如何使用 try-catch 來處理智能合約運行中的異常:
只能用於外部合約調用和合約創建。
如果 try 執行成功,返回變量必須聲明,並且與返回的變量類型相同。
暢行幣圈交易全攻略,專家駐群實戰交流
▌立即加入鉅亨買幣實戰交流 LINE 社群(點此入群)
不管是新手發問,還是老手交流,只要你想參與虛擬貨幣現貨交易、合約跟單、合約網格、量化交易、理財產品的投資,都歡迎入群討論學習!
- 加入鉅亨買幣LINE官方帳號索取免費課程
- 掌握全球財經資訊點我下載APP
文章標籤
上一篇
下一篇