第9章 例外処理

9.1 例外のしくみを知る

 例外とはプログラム実行時に発生する予期せぬエラーのことを言います。PHPプログラムでは発生した例外の内容により「エラー(Error)」と「例外(Exception)」に区別され、その違いはプログラムで対処できるかできないかにあります。「エラー」の場合はプログラムで対処できない致命的な例外を指し、「例外」の場合はプログラムで対処できる例外を指します。
 エラーの例としては、「ハードウェアの故障」、「メモリ不足」などが挙げられます。
 例外の例としては以下が挙げられます。

  • 整数を0で割り算を行った。
  • 配列の要素数より大きい要素数を指定してアクセスを行った。
  • ユーザーが入力間違いを行った。(数値を入力すべきフォームに英字を入力した等)
  • 存在しないファイルを指定し、ファイルの読み込みを行った。
  • データベースに接続が行えなかった。

 上記は、プログラム(ソースコード)を書き終わった時点では見つけにくい・起こらない誤りで、プログラムを実行して初めてエラーがあることが分かります。PHPでは、このような実行時のエラーを適切に処理するために、例外(exception:エクセプション)という仕組みを備えています。

9.1.1 例外の送出

 例外として扱うべきデータが発生した時に、PHPでは意図的に例外を記述することができます。これを、例外を送出するといいます。
 例外を送出する時の構文は以下のようになります。

凡例:例外を送出する構文

 この2つのブロック(tryとcatch)を使う例外処理を記述すると、次のような順番で例外が処理されます。

① tryブロック内で例外が起きると、そこで処理を中断し、発生した例外に対応するcatchブロックを探す。
② 例外がcatchブロックの引数の例外の種類と一致していれば、そのcatchブロック内の処理を行う。
③ catchブロック内の処理が終わったら、そのtry~catchブロックの後の処理を続ける。

 それでは実際に上記①~③のようになるか、次項のサンプルで確認してみましょう。

9.1.2 例外の送出をするプログラム

 テキストボックスが未入力の時に例外を送出するプログラムを動かしてみます。

ソースコード

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

➢ sampleException.php

    <html>
     	<head>
     		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
     		<title>例外を送出する</title>
     	</head>
        <body>
     		<form action="sampleException.php" method="post">
     			<input type="text" name="product" />
     			<input type="submit" value="送信" />
      		</form>
      		<?php
                  try {
                      if(isset($_POST["product"])){
                          if($_POST["product"] == ""){
                              throw new Exception("入力してからボタンを押してください。<br>");
                          }
                          echo "「{$_POST["product"]}」をお買い上げいただきました。<br>";
                      }
                  } catch (Exception $e) {
                      echo $e->getMessage();
                  }
                  echo "テキストボックスに購入する商品名を入力してください。<br>";
      		?>
        </body>
    </html>
	

実行結果

解説
 このプログラムでは12~21行目でtry-catchブロックを使って例外処理を行っています。tryブロック内でテキストボックスに入力された値を判定して処理を行い、catchブロックでは例外に設定されたメッセージを出力しています。そして、try-catchブロックの外側である22行目で、テキストボックスに商品名を入力することを促すメッセージを出力しています。

 今回のプログラムで例外が送付されているのは、15行目になります。テキストボックスの中が空の時に、例外を扱うExceptionクラスのオブジェクトを生成しています。この時引数として渡している文字列が、この例外についてのメッセージとして設定されます。また、tryブロック内で例外が起きるとそこで処理を中断するという仕組みのため、テキストボックスが未入力の時は17行目の処理を行わずに19行目のcatchブロックに処理が移ります。

 catchブロックでは、tryブロックで発生した例外を受け止めています。この時、送出された例外のクラスと、catchブロックの引数のクラスは同じものにする必要があります。今回はExceptionというクラス名で例外を受け渡ししています。また、Exceptionクラスにあらかじめ用意されているgetMessage()メソッドを呼び出すことで、この例外のオブジェクトを生成する時に設定されたメッセージを出力しています。

 そして、try-catchブロックの外側に記述されている22行目のメッセージ出力処理は、テキストボックスの入力値の判定結果とは関係なく、必ず表示されています。

ポイント

・例外処理を扱う時はtry-catchブロックを記載する。
・tryブロック内で例外処理が発生すると、処理を中断してcatchブロックに処理が移る。

エラー制御演算子

 基本的にPHPのプログラムは、Webページを作成し、外部の人間に公開することを想定しています。そのため、きちんと例外処理を組めていればいいのですが、場合によっては想定しなかった例外が発生し、そのエラー情報が出力される時にサーバー側の重要な情報が知られてしまう危険性もあります。
 このようなことを避けるために、PHPにはエラーを制御する演算子@があります。エラー制御を行うためには、以下の例のように関数やメソッドの先頭に@マークを付けます。
 $fp = @fopen($_POST[‘fileName’] , “w”);
 今回の研修では基本的にエラーをtry-catchブロックで処理していくのであまり使うことはありませんが、参考までに覚えておくと良いでしょう。


NEXT>> 9.2 例外を拡張する