第9章 例外処理

9.2 例外を拡張する

 前項ではExceptionというクラスで例外の送出をしていましたが、処理内容によってはよりきめ細かいエラー処理を行ないたいケースもあるでしょう。そういう場合は、例外クラスExceptionを拡張して独自の例外クラスを定義することができます。例外クラスを独自に用意することで、様々な例外に対応することが可能になります。

9.2.1 例外の拡張方法

 例外を拡張して独自の例外クラスを作成する時は、以下のようにクラスの記述を行います。

凡例:例外の拡張方法

 extends Exceptionをクラス名の後ろに記述する(=継承する・拡張する)ことで、例外クラスを独自に定義することができます。また、拡張することでExceptionクラスで定義されている__toString()メソッドの処理内容を上書き(オーバーライド)することができます。__toString()メソッドは、echo文やprint文でオブジェクトを出力した時に呼び出される文字列を返すメソッドで、この戻り値にエラーメッセージを設定することが多いです。

実際に独自の例外クラスを使用したプログラムを次項より紹介していきます。

9.2.2 例外を拡張するプログラム

 これは、前節で作成したsampleException.phpをベースに、独自の例外クラスを組み込んだプログラムです。

ソースコード

ソース・フォルダー  :myproj_framework_basic/ch09
ファイル名      :extendsException.php
アクセスURL    :http://localhost/myproj_framework_basic/ch09/extendsException.php

➢ extendsException.php

    <?php
         // 商品名が未入力の時の例外
         class NoInputException extends Exception{
             function __toString(){
                 return "商品名が入力されていません。<br>";
             }
         }
         // 商品名が長すぎる時の例外
         class TooLongException extends Exception{
              function __toString(){
                  return "商品名が長すぎます。<br>";
              }
          }
      ?>
      <html>
      	<head>
      		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      		<title>例外を拡張する</title>
      	</head>
          <body>
      		<form action="extendsException.php" method="post">
      			<input type="text" name="product"  value="<?php echo $_POST["product"];?>" />
      			<input type="submit" value="送信" />
      		</form>
      		<?php
                  try {
                      if(isset($_POST["product"])){
                          if($_POST["product"] == ""){
                              throw new NoInputException();
                          } elseif (mb_strlen($_POST["product"]) > 10){
                              throw new TooLongException();
                          }
                          echo "「{$_POST["product"]}」をお買い上げいただきました。<br>";
                      }
                  } catch (Exception $e) {
                      echo $e;
                  }
                  echo "テキストボックスに購入する商品名を入力してください。<br>";
      		?>
         </body>
    </html>
	

実行結果

解説
 このプログラムでは3~13行目で独自の例外クラスを2つ作成しています。どちらもクラス名の後ろにextends Exceptionが記述されており、Exceptionクラスを拡張しているクラスであることがわかります。また、それぞれ__toString()メソッドをオーバーライドしており、各クラスをechoした時に出力される文言を設定しています。

 tryブロックでは、28~32行目でテキストボックスの入力値に応じて、独自の例外クラスをそれぞれ設定しています。28行目で判定した結果がtrue(=未入力)の場合はNoInputExceptionクラスのオブジェクトを生成し、30行目で判定した結果がtrue(=マルチバイト文字列の長さが10文字より大きい)場合はTooLongExceptionクラスのオブジェクトを生成しています。

 catchブロックは引数の例外クラスの型をExceptionクラスにしています。今回用意した独自クラスはどちらもExceptionクラスを元に拡張されているので、元のクラスであるExceptionクラスを引数の型にすることで両方を受け止める例外処理を組み立てることができます。

ポイント

・クラスを定義する時にextends Exceptionを記述することで、独自の例外クラスを定義できる。
・例外クラスでは__toString()メソッドを上書き(オーバーライド)してエラー時のメッセージを定義できる。

 この様に、複数の例外を定義して使い分けることが可能です。


NEXT>> 9.3 2つ以上のcatchブロックで処理する