Go-Ethereum
Solidity 中的自定義異常
在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
和添加錯誤消息assert
。throw
已棄用。花了很長時間,但最終添加錯誤語句是可能的。參考使用它的範例契約如下所示:
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。當我探索時會更新答案。