プログラムを実行したときに、エラーが起きることがあります。
ユーザーフォームに入力したデータが無効な値であったり、
数値の入力をしなければならない箇所に、文字列を設定した時などです。
PHPでは、こうしたエラーを適切に処理するために、
例外(exception)というしくみを利用します。
エラーが発生したときに、このエラーに対応する処理を書きます。
このとき、例外を送出する処理をします。
送出された例外を受け取ったときにエラーを処理します。
try{
throw new 例外;
}
catch(例外のクラス 変数名){
例外発生時の処理;
}
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<!doctype html> <html> <head> <meta charset="utf-8"> <title>PHPで例外処理</title> <link rel="stylesheet" href="../style.css"> </head> <body> <h2>例外処理のテスト</h2> <form action="" method="post"> <input type="text" name="product"> <input type="submit" value="送信"> </form> <?php //tryブロックで囲む try{ if( isset($_POST["product"])){ //フォームに何か入力されているか判定 if( $_POST["product"] == "" ){ //何も入力されていないとき //例外処理を送出 throw new Exception("入力してください"); }else{ echo "「{$_POST["product"]}」と入力<br>"; } } //catchブロックで送出した例外処理をキャッチする }catch(Exception $e){ //例外処理を出力する echo $e->getMessage(); } ?> </body> </html> |
例外処理を行うとき、例外が発生するであろう箇所にtryブロックで
囲みます。この中で例外を送出します。今回は、フォームの入力値が
何もなく、送信ボタンが押されたときに例外を送出します。
例外を送出するには、PHPに備え付けられているExceptionクラスの
オブジェクトを作成します。
例外が創出されて、そのクラスがcatchブロックの引数の型と同一で
あるならcatchブロックの処理が行われます。
今回は、ExceptionクラスのgetMessage()メソッドを実行して、
作成時に与えられたメッセージを表示します。
tryブロックで例外を検知して、catchブロックで受け止めて
処理をすることができます。
例外を拡張する
細かいエラー処理を行い時があります。そんなときは、
例外クラスExceptionを拡張し独自の例外クラスを定義する
というものがあります。例外クラスを作ることができれば、
色々な例外を起こすことができます、、
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
<!doctype html> <html> <head> <meta charset="utf-8"> <title>例外を拡張してみる</title> <link rel="stylesheet" href="../style.css"> </head> <body> <form action="" method="post"> <input type="text" name="product"> <input type="submit" value="送信"> </form> <?php try{ if( isset($_POST["product"]) ){ if( $_POST["product"] == ""){ throw new InputNothingException; }elseif( strlen( $_POST["product"] ) > 10 ){ throw new StringLongException; }else{ echo "「{$_POST["product"]}」をお買い上げ<br>"; } } }catch(Exception $e){ echo $e; } class InputNothingException extends Exception { function __toString(){ return "何も入力されていません<br>"; } } class StringLongException extends Exception { function __toString(){ return "商品名の文字が長すぎです。<br>"; } } ?> </body> </html> |
Exceptionクラスの派生クラスでは、__String()メソッドを
オーバーライドすることができます。このメソッドは、echoやprint文で
オブジェクトを出力したときに呼び出されるメソッドです。
例外を拡張して送出することができる。
2つ以上のcatchブロックを設置してみる
上記のサンプルコードでは、2つの例外を定義しました。
定義した複数の例外に対して、異なる処理をすることができれば、
細かいエラー処理ができるようになります。例外の種類に
対応するcatchブロックは、、複数書くことができます。
サンプルコードの実行結果はこちら
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<!doctype html> <html> <head> <meta charset="utf-8"> <title>複数のcatchブロックを書いてみる</title> <link rel="stylesheet" href="../style.css"> </head> <body> <form action="" method="post"> <input type="text" name="product"> <input type="submit" value="送信"> </form> <?php try{ if( isset($_POST["product"]) ){ if( $_POST["product"] == ""){ throw new InputNothingException; }elseif( strlen( $_POST["product"] ) > 10 ){ throw new StringLongException; }else{ echo "「{$_POST["product"]}」をお買い上げ<br>"; } } }catch(InputNothingException $e){ //19行目の例外処理はここで受け取り処理をする echo $e . "商品名を入力してください。"; }catch(StringLongException $e){ //24行目の例外処理はここで受け取り処理をする echo $e . "10文字未満にしてください。"; } class InputNothingException extends Exception { function __toString(){ return "何も入力されていません<br>"; } } class StringLongException extends Exception { function __toString(){ return "商品名の文字が長すぎです。<br>"; } } ?> </body> </html> |
上記のサンプルコードは、2つの例外に対して、それぞれcatchブロックを
書きました。例外の種類に応じたエラー処理ができます。
エラー制御演算子
PHPはウェブページを作成して外部の人に見せることを想定しています。
そのとき、エラー情報が出力されると、サーバー側の重要な情報が
知られてしまう危険性というものがあります。その事態を避けるために、
PHPにはエラーを制御する演算子「@」があり、エラー制御を行うには、、
式の先頭に「@」を付けます。
$fp = @fopen( $_POST["title"],"w");