【開發智能合約 — Solidity系列】實作篇Ep.5 - 錯誤處理的機制(Error Handling)

閱讀時間約 6 分鐘
Solidity語言的錯誤檢查提供了Require()、Revert()、Assert(),這三種方便的API調用,而這三種用途分別不同,畢竟牽涉到瓦斯費的問題,因此才會與過往的程式語言有些許的差異,

Require

require()通常會被使用在輸入值的驗證檢查,因為它的特性主要是能夠退回剩餘的Gas fee,我們也知道瓦斯費在區塊鏈的成本是昂貴的,因此這些檢查都有助於不必要的浪費,主要使用方式為:
require(判斷式, 訊息)
...
contract Example {
... function withdraw(uint amount) public pure {
uint total = 100;
/// @dev 提款的數量必須低於總額度
/// @notice 使用require(), 當條件不滿足時將退回剩下的瓦斯費,所以通常會放在前面
require(amount <= total, "amount must less then total"); ...
}
}

Revert

revert()顧名思義為撤銷的意思,也就是通常不符合某些條件時則進行撤銷,與reqiure一樣是會退回剩餘的Gas fee,那看到這邊可能心裡會產生一些疑問,比如說為什麼不用require就好了呢? 兩者語意事實上是有差異的。
  • require表述的是「必須要滿足什麼條件」。
  • revert則表述「當什麼條件未被滿足」時進行撤回。
/// @dev 自訂錯誤類型: 資金不足
/// @param requested 要求的資金
/// @param available 可用的資金
error NotEnoughFunds(uint requested, uint available);function ... {
/// @dev 提款的金額不能大於存款
/// @notice 若提出的金額超過存款總額,則退回撤銷並退回狀態。
if (amount > total) {
revert NotEnoughFunds(amount, total);
}
}
另外revert使用的方式有以下三種:
  • revert CustomError(…)
  • revert(”message”)
  • revert()
剛開始可能會有些霧裡看花,這麼多不同的承接方式與參數,但撰寫一段時間過後就會相當熟練,且在合適的時機使用正確的方式。

Assert

assert()跟require()一樣,算是進行檢核的機制,必須滿足某些條件才能繼續執行,但最大的差異在於當條件不滿足時,會耗盡Gas fee,因此通常用來處理比較嚴重且不易發生的錯誤,例如邊界值、特殊條件…等程式內部錯誤,也是最不常被使用的錯誤處理方法。
/// @dev 提款的額度必須是正整數
assert(amount > 0);

Try … Catch

相信這種語法如果有在開發其他程式的朋友應該非常熟悉,沒錯,Solidity亦提供這種錯誤處理機制,但值得注意的是在智能合約的世界中僅適合外部調用,白話來說就是A合約去嘗試使用B合約的功能,語法結構主要為:
try ...使用A合約進行什麼操作 {
...成功之後的處理
} catch ...什麼類型的錯誤 {
...進行什麼處理
} catch ...什麼類型的錯誤 {
...進行什麼處理
}
而錯誤的捕捉類型又分為以下四種方式,分別說明:
contract Example {
...
}contract Runner {
Example public example; constructor() {
example = new Example();
} function exec() public view {
uint errorCount = 0;
try example.withdraw(101) {
// 提款成功之後...
} catch Error(string memory /*reason*/) {
// 這種錯誤類型主要是處理帶有錯誤訊息的錯誤處理函數: require(..., "錯誤訊息")、revert("撤銷訊息")
errorCount++;
} catch Panic(uint /*errorCode*/) {
// 這種錯誤類型主要處理assert(...)這種內部錯誤
errorCount++;
} catch (bytes memory /*lowLevelData*/) {
// 這種錯誤通常發生在更低階的處理,像是在解譯(decode)的階段
errorCount++;
} catch {
// 如果不想知道錯誤訊息或者原因時,可以直接用catch { ... }進行錯誤的對應處理。
}
}
}

結語

原來一個簡單的錯誤處理背後其實並不簡單…,與「金錢」有關的產品或服務最重要的莫過於嚴謹的審查機制,因此很多錯誤都是不能被容忍的,故而錯誤處理的機制就顯得非常重要,處理方式也相較於大部分程式語言有所不同,主要是因為納入了Gas fee的緣故,以此為鑑,當開發者進行開發智能合約時的錯誤處理也要非常小心,哪個使用情境要用哪一種錯誤處理的技巧並且不浪費Gas fee的狀況下,真的是對於智能合約開發者來說是一大挑戰,相信我們只要讀懂這些錯誤處理的概念後,未來開發時就會特別注意。
今天的範例都在這裡「📦 solidity-remix-toturial/Ep5」歡迎自行取用。

資源參考

為什麼會看到廣告
95會員
235內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
開發金 台股 2024~2021六月第一週筆記台股收在21858點,然後就端午節了。有好幾年都很怕端午變盤,沒想到做股票久了就也不怕了。 端午節前發現開發金有漲,查了一下,原來是改名+二王子要回來了,目前股價15元。
Thumbnail
avatar
瑩瑩米袋子
2024-06-10
開發logo靈感合集欣賞親愛的讀者,你知道什麼是LOGO嗎? LOGO是:外來語到對標誌擁有公司的識別和推廣的作用,透過形象的logo可以讓消費者記住公司主體和品牌文化。 標誌特徵與特性: 延展性:企業logo是應用最為廣泛,出現頻率最高的視覺傳達要素,必須在各種傳播媒體上廣泛應用。logo圖形要針對印刷
Thumbnail
avatar
全能Logo設計師
2024-05-14
生技論壇闡述產業前景火熱,長佳智能、台康、開發金、鑽石生技正面看待,凸顯ABVC集團這顆耀眼金星《經濟日報》日前於台北國際會議中心盛大舉辦「2023生技論壇」,邀請衛福部長薛瑞元、生策會副會長楊泮池、長佳智能董座陳明豐在內的多位官、商、學界專家、學者參與盛會,深入研討新冠肺炎疫情後的經濟重組;瞄準再生醫療、精準醫療、大健康領域等生技產業範疇,藉由共同發聲、齊心努力,對此應有推波助瀾之效。
Thumbnail
avatar
Michael
2023-11-16
如何進行求職平台的產品分析?產品開發順序怎麼制定?|EP38剛好前陣子在求職平台/人力銀行服務,一直在思考整個產品要如何進行迭代優化,以及要如何根據使用者需求來制定產品路線圖、開發優先順序,這篇會介紹求職平台的產品特點、使用者路徑、以及從產品優化的角度如何拆解。
Thumbnail
avatar
張家惟 Evan Chang
2023-09-29
[micro:bit]Yahboom 亞博智能搖桿遙控擴展開發板 購買網站:https://shopee.tw/【樂意創客官方店】 使用方式 擴展網址:https://github.com/lzty634158/GHBit 在擴展頁面輸入“https://github.com/lzty634158/GHBit” 按下Enter 搜尋,就可以發現GHBit
Thumbnail
avatar
艾利斯
2023-09-20
智能合約開發實戰(14) - 實作一個簡單的錢包介紹了這麼多Solidity的函數和方法,今天來寫一個簡單的錢包,順便介紹一下payable。
Thumbnail
avatar
宅D嘉
2022-04-16
智能合約開發實戰(11) - Mapping此篇我們也來介紹另外一個也是蠻常用又蠻重要的Mapping,它和陣列有點像,但比較不同的是:它不能用迴圈的方式取出裡面所有的資料,但陣列可以,Mapping比較像是一個查詢系統,用key值可以取出裡面的value值。
avatar
宅D嘉
2022-03-26
智能合約開發實戰(十) - Array 陣列這篇我們來看一個在程式開發很常見也很常用的一個東西:Array 陣列 Array在所有的程式開發中還蠻常見的,也一定會出現,因為有很多的資料都會是一長串的,需要有一個物件來去做集中管理。
Thumbnail
avatar
宅D嘉
2022-03-19
智能合約開發實戰(九) - 錯誤處理函數(require、revert、assert)在寫程式裡面,錯誤的檢查和處理是一定要有的,也是相對重要的,但Solidity裡面並沒有ErrorMessage這種東西,有的是Require()、Revert()、Assert()這三個函數,作用大概也跟ErrorMessage差不多,這裡介紹這三種函數的用法
avatar
宅D嘉
2022-03-05
智能合約開發實戰(八) - 函式修飾詞我們知道function除了四種可見度 (visibility) 之外,還有三種比較常見的函式修飾詞(view、pure、payable),這篇就也來認識一下這三種函式修飾詞是做什麼用的吧。
avatar
宅D嘉
2022-02-26