第9章 例外処理

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

 前節のように定義した複数の例外に対して、1つのcatchブロックで対応しようとすると、どうしても共通点をまとめたような大雑把な処理内容になってしまいます。各例外に対してそれぞれ異なる処理内容を記述すれば、もっときめ細かいエラー処理にできるはずです。
 そこで、catchブロックを複数記述する例外処理の出番です。

9.3.1 catchブロックが2つあるプログラム

 このプログラムは、前節で作成したexpendsException.phpをベースに、catchブロックを2つ用意したプログラムです。

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

➢ twoException.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>2つのcatchブロックを使う</title>
      	</head>
          <body>
      		<form action="twoException.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 (NoInputException $e) {
                      echo $e . "入力をお願いします。<br>";
                  } catch (TooLongException $e){
                      echo $e . "正しい商品名をお願いします。<br>";
                  }
                  echo "テキストボックスに購入する商品名を入力してください。<br>";
      		?>
        </body>
    </html>
	

実行結果

解説
 前節のextendsExceptionとの違いとしては、35~39行目でcatchブロックを2種類用意している点にあります。今回はそれぞれの例外クラス用のcatchブロックを用意し、それぞれechoする際に別の文言を添えて出力しています。


 このように、それぞれの例外に応じて実行させたい処理を分けて定義することが可能です。

ポイント

・catchブロックは例外の種類に応じて複数定義することができる。


NEXT>> 9.4 本章のまとめ