【Ethereum】Solidityでの例外処理(require,revert)でエラーメッセージを出力する
日本語での情報があまりなかったので書いておく。
Solidity0.4.22より、require()
やrevert()
による例外処理でエラーメッセージが出力できるようになった。
記述方法
require(条件, メッセージ); revert(メッセージ);
具体例(require)
require(msg.value % 2 == 0, "Even value required.");
具体例(revert)
if (msg.value % 2 != 0){ revert("Even value required."); }
デバッグが捗って嬉しい!
例えば、以下のsetNumber()のようなやたら制限したがる関数があったとする。
この関数を呼び出すトランザクションを発行してエラーになったとき、どこでエラーになったのかパッと見て分からない。
そこで、setNumber2()のように書いてあると、エラーが出力されエラーの原因がすぐにわかる!
pragma solidity ^0.4.22; contract test{ address owner; uint number; constructor () public{ owner = msg.sender; } //エラーの理由がわからない function setNumber(uint _number) public { require(msg.sender == owner); require(msg.sender.balance > 100000); require(_number > 0); require(_number%10 == 0); number = _number; } //エラーの理由がわかる!!! function setNumber2(uint _number) public { require(msg.sender == owner, "only owner"); require(msg.sender.balance > 100000, "balance: more than 100000 wei required"); require(_number > 0, "_number: more than 0 required"); require(_number%10 == 0, "_number: cannot be devisible by 10"); number = _number; } }
ちなみに、assert()
についてはメッセージ出力は現時点では対応していないっぽい。
以下、参考。