day14. Solidity基本文法 – エラーハンドリング –

コーディングにおいて、エラーハンドリングは重要な要素です。適切なタイミングで、分かりやすいエラーを返すように作ることは、問題発生時の解析、改善策を導き出すことの助けになります。 このガイドでは、Solidityのエラーハンドリングについて解説します。

コーディングにおいて、エラーハンドリングは重要な要素です。適切なタイミングで、分かりやすいエラーを返すように作ることは、問題発生時の解析、改善策を導き出すことの助けになります。
このガイドでは、Solidityのエラーハンドリングについて解説します。

目次

revert

revertとは、直前までに行おうとしていた変更をすべて、破棄し、元の状態に戻すということを実行する関数です。通常の利用の仕方は、特定の望ましくない条件になった場合には、エラーをつけてrevertを行う、といった形でしょう。

revertを実行する際には、引数としてエラーメッセージをつけて実行するというやり方や事前に定義したカスタムのエラー型を添えて、実行するというやり方があります。

day11fund関数の中で、条件によってはエラーとともにrevertする形へと変更したのが次の例です。

1つ目のrevertは、カスタムエラーをつけて実行されています。このカスタムエラーは、contractの外で事前に定義されています。カスタムエラーはこのように引数を取ることが可能です。

2つ目のrevertは、エラーメッセージを引数にして、実行されています。

Solidity
// 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しようとして失敗しているか)を確認することもできます。

カスタムエラーの場合のエラー表示例
エラーメッセージでrevertした場合のエラー表示例

require

requireは、エラーチェックや条件の検証に使用される関数です。requireは引数として条件とエラーメッセージを取ります。条件を満たす場合には処理を継続し、満たさない場合には、エラーメッセージを出力し、処理を中断します。

同じday11fund関数に条件を追加したのが次の例です。送金された金額が0.1ETH以上の場合、4,5行目は実行されますが、0.1ETH以下の場合には、処理エラーとなり、トランザクションがrevertされます。

Solidity
...
  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;
  }
...
エラーメッセージ("value should be greater than 0.1 ETH")とともに処理がエラーとなっている。

ご意見をお聞かせください!

web3チュートリアルシリーズについてのご意見を是非お聞かせください。

この記事、または、web3チュートリアル全体について、是非、あなたのご意見をお聞かせください。
アンケートはこちらからご回答いただけます。

無料相談承ります

ITの専門家が無料相談を受け付けます。web3以外のテーマでもOKです。

オンラインでの無料相談を承っています。ご希望の方は、お問い合わせフォームよりご連絡ください。
ITの専門家があなたのご質問にお答えいたします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

After joining IBM in 2004, the author gained extensive experience in developing and maintaining distributed systems, primarily web-based, as an engineer and PM. Later, he founded his own company, designing and developing mobile applications and backend services. He is currently leading a Tech team at a venture company specializing in robo-advisory.

コメント

コメントする

CAPTCHA


目次