2022-03-05|閱讀時間 ‧ 約 3 分鐘

智能合約開發實戰(九) - 錯誤處理函數(require、revert、assert)

在寫程式裡面,錯誤的檢查和處理是一定要有的,也是相對重要的,但Solidity裡面並沒有ErrorMessage這種東西,有的是Require()、Revert()、Assert()這三個函數,作用大概也跟ErrorMessage差不多,下面我們就來看看這三種函數的用法:

Require

require是最常用的錯誤檢查函數,常出現在function的一開始,做為檢查參數是否有錯誤用,由於require為false時會退回剩下的gas,所以才會放在function的一開始,這樣就能節省gas fee了,因為後面的程式碼不會執行。 require(判斷式, 返回字串)
function deposit(int _amount) public {

//require(判斷式, 返回字串)

require(_amount > 0, "Deposited amount must be greater than zero");

}

Revert

revert用於已經在複雜邏輯的情況下了,出錯時要直接回覆訊息,由於revert裡面只包含了執行返回錯誤訊息的文字,所以當用在已經有很多判斷式了,在false裡面要丟出錯誤訊息之用,但由於等於中斷了,所以也和require一樣會把剩下的gas fee退回。 revert(返回字串)
int public balance;

function deposit(int _amount) public {
  int oldBanance = 0;
  if(balance < oldBanance) {
    //revert(返回字串)
    revert("Impossible!");
  }
}

Assert

assert比較少用,主要是做最後的檢查,避免不應該發生的情況發生,由於assert會吃掉所有的Gas fee,所以大部份都是放在最後面做為避免不可預期狀況的檢查之用。 assert(判斷式)
int public balance;
int public oldBanance = 0;
function deposit(int _amount) public {
  //do something
  //assert(判斷式)
  assert(balance >= oldBanance);
}
從上面的說明應該就很好判斷什麼時候應該用哪一個函數,寫Solidity中,最常用的還是Require(),因為它有判斷式,也有回覆字串,如果你在網路上看別人寫的智能合約的話,會常看到Require(),這是因為比較省Gas fee,而且在function前面也常寫Require用來檢查帶入的參數,以防後面的計算出錯,然後最後才寫assert()來檢查內部錯誤,因為assert會吃掉全部的Gas fee,所以最後再使用,所以在使用這三種函數時,也要知道它們和Gas fee的關係,這樣才不會浪費了Gas fee,要知道在乙太鏈中,Gas fee可是很貴的,以上是對錯誤處理函數的介紹,謝謝。
有什麼想要了解或是不清楚的部份,歡迎留言和我分享,謝謝。 如果喜歡我的文章歡迎追隨,按愛心,我每週都會上新文章。
分享至
成為作者繼續創作的動力吧!
有著十年以上的軟體開發經驗,喜歡投資理財,目前喜歡研究區塊鏈相關,了解虛擬貨幣投資或者是區塊鏈開發,喜歡把複雜的東西簡單化,樂於分享我的理財投資生活。
© 2024 vocus All rights reserved.