例外処理について

2018/10/12

今回はPHPにおける例外処理についてエントリーします。

まず例外処理とは何か?

・スクリプトを実行したときにデータベースが存在しない
・読み込もうとしたファイルが存在しない

このようなエラー(例外)が発生しても正常にスクリプトが動作するようにすることを例外処理といいます。

 

構文

例外処理の構文は以下のような書式になります。

try {

  // 例外が発生するおそれがあるコード

} catch(例外クラス名 例外を受け取る変数名){

  // 例外発生時の処理

}

catch() で例外を検知します。

catch() の引数には例外クラスを置きます。

PHP にはデフォルトで Exception という例外クラスが用意されています。

catch の引数にはこれを使うか、もしくは Exception クラスを継承した子クラスを指定します。

例えば、warizan という関数の例外を検知する場合は以下のような記述になります。

例外処理

try{
  echo warizan(6,0);
}catch(Exception $e){
  echo "エラー:" . $e->getMessage();
}

例外の判定基準は、warizan 関数に記述します。

例外の判断

function warizan($num1,$num2){
  if( $num2 == 0 ){
  throw new Exception("0では除算できません");
  }
return $num1 / $num2;
}

上記の例だと $num2 が 0 の場合、例外として処理をする挙動になります。

例外を知らせることを、例外を投げる(スローする)といいます。
例外を投げる構文は以下になります。

throw new 例外クラス名(例外メッセージ)

また、例外メッセージを取得するには Exception クラスの getMessage メソッドを使用します。

try~catch 構文で例外をキャッチしたら例外処理は主に以下のような記述をします。

echo "エラー:" . $e->getMessage();

 

チュートリアル

data.txt ファイルがあるかないか検知し、あれば書き込み、なければエラーメッセージを表示させます。

なお、ソースコードは以下のようになります。

 

手順

1)例外クラスの定義
2)クラスの作成
3)例外処理
4)書き込みファイルを作成

 

1)例外クラスの定義

excepton クラスを継承して独自の例外クラスを定義します。

class FileNotFoundException extends exception{
}

 

2)クラスの作成

FileWrite クラスを作成して例外判定処理を記述します。

例外に該当する場合は例外をスローします。

class FileWrite{

function read($filename){

//  例外を判定
if(!file_exists($filename)){
  // 例外を投げる(スローする)
  throw new FileNotFoundException("ファイル:".$filename."が存在しません!!");
}

// ファイルがあったらテキストを書き込む
file_put_contents($filename, 'ファイルがあったのでテスト書き込み!'."<br>\n",FILE_APPEND | LOCK_EX);

// ファイルを読み込んで表示させる
readfile($filename);
}
}

 

3)例外処理

try~catch構文で例外処理を記述します。

try{

  // 例外が発生するおそれがあるコード
  $class = new FileWrite();
  $class->read("data.txt");

}catch(FileNotFoundException $e){ # $eの変数にFileNotFoundExceptionクラスのインスタンスを代入

  // 例外発生時の処理
  echo "例外キャッチ:",$e->getMessage(),"\n";
}

 

4)書き込みファイルを作成

書き込み&読み込みファイルである data.txt を同階層に作成します。

ブラウザにアクセスしてdata.txtに「ファイルがあったのでテスト書き込み!」が追記されているか確認します。

次に data.txt を削除して「例外キャッチ:ファイル:data.txtが存在しません!!」が表示されればOKです。

phpの例外処理に関しては以上になります。

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識