原文標題:《 Solidity 極簡入門: 30. Try Catch 》
原文作者:0xAA
我最近在重新學 solidity,鞏固一下細節,也寫一個「Solidity 極簡入門」,供小白們使用(編程大佬可以另找教程),每週更新 1-3 講。
所有代碼和教程開源在 github:github.com/AmazingAng/WTFSolidity
try-catch 是現代編程語言幾乎都有的處理異常的一種標準方式,solidity0.6 版本也添加了它。這一講,我們將介紹如何利用 try-catch 處理智能合約中的異常。
在 solidity 中,try-catch 只能被用於 external 函數或創建合約時 constructor(被視爲 external 函數)的調用。基本語法如下:

其中 externalContract.f() 時某個外部合約的函數調用,try 模塊在調用成功的情況下運行,而 catch 模塊則在調用失敗時運行。
如果調用的函數有返回值,那麼必須在 try 之後聲明 returns(returnType val),並且在 try 模塊中可以使用返回的變量;如果時創建合約,那麼返回值是新創建的合約變量。

另外,catch 模塊支持捕獲特殊的異常原因:

我們創建一個外部合約 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