コーディングにおいて、エラーハンドリングは重要な要素です。適切なタイミングで、分かりやすいエラーを返すように作ることは、問題発生時の解析、改善策を導き出すことの助けになります。
このガイドでは、Solidityのエラーハンドリングについて解説します。
revert
revert
とは、直前までに行おうとしていた変更をすべて、破棄し、元の状態に戻すということを実行する関数です。通常の利用の仕方は、特定の望ましくない条件になった場合には、エラーをつけてrevert
を行う、といった形でしょう。
revert
を実行する際には、引数としてエラーメッセージをつけて実行するというやり方や事前に定義したカスタムのエラー型を添えて、実行するというやり方があります。
day11のfund
関数の中で、条件によってはエラーとともにrevert
する形へと変更したのが次の例です。
1つ目のrevert
は、カスタムエラーをつけて実行されています。このカスタムエラーは、contract
の外で事前に定義されています。カスタムエラーはこのように引数を取ることが可能です。
2つ目のrevert
は、エラーメッセージを引数にして、実行されています。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
error Fund__NotEnoughETH(uint256 fundedAmount); // カスタムエラー
contract Funding {
...
function fund() public payable {
if (msg.value < 100000000000000000) {
revert Fund__NotEnoughETH(msg.value); // 0.1ETH以下の場合、カスタムエラーを添えてrevert
} else if (msg.value > 10000000000000000000) {
revert("Funded amount should be less than 10 ETH!"); // エラーメッセージを引数としてrevert
}
s_funders.push(msg.sender);
s_addressToAmount[msg.sender] += msg.value;
}
...
それぞれの条件に合致するようにした場合、以下のそれぞれの画像のようにRemixのコンソール上にエラーが表示されています。カスタムエラーについては、具体的な値(いくらfund
しようとして失敗しているか)を確認することもできます。
require
require
は、エラーチェックや条件の検証に使用される関数です。require
は引数として条件とエラーメッセージを取ります。条件を満たす場合には処理を継続し、満たさない場合には、エラーメッセージを出力し、処理を中断します。
同じday11のfund
関数に条件を追加したのが次の例です。送金された金額が0.1ETH以上の場合、4,5行目は実行されますが、0.1ETH以下の場合には、処理エラーとなり、トランザクションがrevert
されます。
...
function fund() public payable {
require(msg.value > 100000000000000000, "value should be greater than 0.1 ETH");
s_funders.push(msg.sender);
s_addressToAmount[msg.sender] += msg.value;
}
...
ご意見をお聞かせください!
この記事、または、web3チュートリアル全体について、是非、あなたのご意見をお聞かせください。
アンケートはこちらからご回答いただけます。
無料相談承ります
オンラインでの無料相談を承っています。ご希望の方は、お問い合わせフォームよりご連絡ください。
ITの専門家があなたのご質問にお答えいたします。
コメント