header-langage
简体中文
繁體中文
English
Tiếng Việt
한국어
日本語
ภาษาไทย
Türkçe
掃碼下載APP

Solidity極簡入門|第三十講:Try Catch

閱讀本文需 7 分鐘
本文介紹瞭如何使用try-catch來處理智能合約運行中的異常。
原文標題:《 Solidity 極簡入門: 30. Try Catch 》 
原文作者:0xAA 


我最近在重新學 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 執行成功,返回變量必須聲明,並且與返回的變量類型相同。  


原文鏈接


歡迎加入律動 BlockBeats 官方社群:

Telegram 訂閱群:https://t.me/theblockbeats

Telegram 交流群:https://t.me/BlockBeats_App

Twitter 官方帳號:https://twitter.com/BlockBeatsAsia

举报 糾錯/舉報
選擇文庫
新增文庫
取消
完成
新增文庫
僅自己可見
公開
保存
糾錯/舉報
提交