Go-Ethereum

Solidity 中的自定義異常

  • November 27, 2021

在solidity中,有沒有辦法拋出custom Exceptions錯誤消息?我throw用來阻止進一步執行我的程式碼,但這總是導致invalid JUMP(在 geth 控制台中,在調試中)和Intrinsic gas too low(在 Mist 中)。我可以有自定義錯誤消息嗎?

例如,當發送者的餘額小於他想要轉移的金額時,我們可以修改transfer(..)函式以產生錯誤消息嗎?account balance is low

function transfer(address _to, uint256 _value) {

   if (balanceOf[msg.sender] < _value)        // Check if the sender has enough
{
       throw;  
       // some code to display  "account balance is low" to  user instead of 'Intrinsic Gas too low'
}

   balanceOf[msg.sender] -= _value;                     // Subtract from the sender
   balanceOf[_to] += _value;                            // Add the same to the recipient
   Transfer(msg.sender, _to, _value);                // Notify anyone listening that this transfer took  

}

目前乙太坊虛擬機程式碼中沒有自定義異常。所有故障條件都是“​​氣體不足”,因為異常被建模為消耗所有剩餘的氣體。

eth.debug.traceTransaction API 可能會給你一些見解,但據我所知,它目前並沒有實現人類可讀的錯誤機制。

從 solidity 0.4.22 開始,可以使用require和添加錯誤消息assertthrow已棄用。花了很長時間,但最終添加錯誤語句是可能的。參考

使用它的範例契約如下所示:

pragma solidity ^0.4.23;
contract TestExceptionHandling{
   uint public a ;
   constructor(uint _a) public{
       a= _a;
   }
   function increaseA(uint b) public{
       require(b > a, 'new value must be greater than a');
       if (b > 50){
           revert('Very large value');
       }
       a = b;
   }
}

我不確定如何在 DAPP 中擷取此錯誤消息並將錯誤消息顯示給 UI。當我探索時會更新答案。

引用自:https://ethereum.stackexchange.com/questions/7902