【PHP入門】Exceptionクラス徹底解説!例外をthrowしてtry~catchする

こんにちは!料理があまり得意ではなく、たまに味付けに失敗するmuramatsuです。味見をすればいいのですが、味見をしていると味がだんだん分からなくなってくるので、誰かに聞くようにしました。

さてPHPでは、プログラム実行中に発生する例外エラーに対して処理を行うことができます。この記事では、Exceptionクラスの使用方法が知りたい、例外メッセージや例外コードを取得する方法が知りたいという基本的な内容から、

  • 例外を拡張する方法が知りたい
  • 例外をネストする方法が知りたい

といった応用的な内容に関しても解説していきます。今回はそんなExceptionの使い方についてわかりやすく解説します!

>※この記事のコードはWindows10,XAMPP7.3.0,PHP7.3.0にて動作確認を行いました。

目次

Exceptionとは

プログラムの実行中に発生するエラーを例外といいます。PHPでは、この例外をExceptionクラスで扱います。Exceptionクラスは例外の内容を表すメッセージやコード、プログラムのどこで例外が発生したかなどの情報を持ちます。

例えば入力フォームに入力したデータが

  • 何も入力されなかった
  • 文字数制限を超えている
  • 適切な文字または数字を入力していない

などが発生する可能性があります。こうした事項はエラー(例外)として考えられ、適切な処理をしなければなりません。例外に対して何も処理を行わないと、例外が発生した時、プログラムはそこで異常終了してしまいます。それを防ぐために、例外に応じた例外処理を行います。

例外が発生することを、例外が投げられる(throwされる)といいます。

書き方:

<?php

throw new Exception();

?>

ここでは例外をthrowしていますが、例外処理を指定していないので実行するとFatal errorと表示されます。例外処理を指定するには、投げられた例外を捕捉(catch)しなければなりません。

例外を捕捉するには、例外が投げられるコードをtryブロックで囲み、それに対応するcatchブロックを記述します。

書き方:

<?php

try {
    // 例外が発生する可能性のあるコード
} catch (Exception $e) {
    // 例外が発生した場合に行う処理
}

?>

例外が発生する可能性のあるコードには、例外発生とする条件や例外を投げるコードが入ります。例外発生とする条件はif文が主に使われ、例外を投げるコードはthrow new Exeption()となります。

Exceptionの使用方法

基本の使い方

例外処理を行う方法を以下に記述します。変数$argの値が10の時は例外を発生させず、0の時に例外発生としExceptionを表示させます。

サンプルプログラム:

<?php

function func($arg) {
    echo "func start.<br>";
    try {
        // $argが0だったら例外を投げる
        if ($arg == 0) {
            throw new Exception();
        }
 
        // $argの値を表示
        echo "arg=".$arg;
        echo "<br>";
    } catch(Exception $e) {
        echo "catch Exception.<br>";
    }
    echo "func end.<br>";
}
 
func(10); // 引数10でfunc関数を実行
echo "<br>";
func(0); // 引数0でfunc関数を実行

?>

実行結果:

func start.
arg=10
func end.
 
func start.
catch Exception.
func end.

func関数は、引数($arg)の値を表示する関数です。tryブロックのif ($arg == 0)で引数の値を比較し、0の場合はthrow new Exception()で例外を発生させます。最初にfunc(10);で、引数10でfunc関数を実行しています。

ここでは例外が発生しないため、tryブロックが最後まで実行され、catchブロックは実行されません。catchブロックの後の処理が実行され、func関数は終了します。次にfunc(0);で、引数0でfunc関数を実行しています。

ここでは例外が発生します。例外が発生すると、tryブロックの例外発生以降の処理は実行されず、catchブロックが実行されます。その後はcatchブロックの後の処理が実行され、func関数は終了します。

getMessageで例外メッセージを取得する

例外には例外メッセージを持たせることができます。例外メッセージはどのようなエラーが発生したかのか示すために使われます。例外メッセージを取得するには、ExceptionクラスのgetMessageメソッドを使用します。

Exceptionに例外メッセージを設定するには以下のように記述します。

書き方:

throw new Exception(‘例外メッセージ’);

メッセージは文字列なのでシングルクォーテーション(‘ ‘)またはダブルクォーテーション(“ “)で囲みます。例外に設定されたメッセージを取得するサンプルです。

サンプルプログラム:

<?php

try {
    //文字列‘exception!!’を投げる
    throw new Exception('exception!!');
} catch(Exception $e) {
    //getMessageで例外メッセージを取得
    echo $e->getMessage();
}

?>

実行結果:

exception!!

tryブロックのthrow new Exception(“exception!!”)で例外メッセージ‘exception!!’を設定します。catchブロックの$e->getMessage()で例外メッセージを取得し表示しています。

getCodeで例外コードを取得する

例外には例外コードを持たせることができます。例外コードは整数値で、例外の識別に使われます。例外コードの番号に決まりは特になく、自分で設定するか、開発しているプロジェクト、アプリケーションによって設定します。例外コードを取得するには、ExceptionクラスのgetCodeメソッドを使用します。また、Exceptionに例外コードを設定するには以下のように記述します。

書き方:

throw new Exception(‘例外メッセージ’, 例外コード);

例外に設定されたコードを取得するサンプルです。

サンプルプログラム:

<?php

try {
//999というコードを設定    
throw new Exception('exception!!', 999);
} catch(Exception $e) {
    //コードを取得し出力する
    echo $e->getCode();
}

?>

実行結果:

999

tryブロックのthrow new Exception(‘exception!!’, 999)で例外メッセージと例外コードを設定します。catchブロックの$e->getCode()で例外コードを取得し、表示しています。

例外を拡張して独自の例外クラスを定義する

Exceptionクラスを拡張し、独自の例外クラスを使用することもできます。例外クラスを拡張するとは、Exeption(例外)クラスを継承します。独自の例外を処理するサンプルです。

サンプルプログラム:

<?php

class MyException1 extends Exception {
}
class MyException2 extends Exception {
}

try {
    throw new MyException2();
} catch(MyException1 $e) {
    echo 'MyException1';
} catch(MyException2 $e) {
    echo 'MyException2';
}

?>

実行結果:

MyException2

クラスMyException1・MyException2はExceptionを拡張したクラス(子クラス)で、Exceptionと同様に例外として投げたり捕捉することができます。またcatchブロックは複数記述することができ、発生した例外に該当するcatchブロックが実行されます。

throw new MyException2()で例外を発生させ、catch(MyException2 $e)で捕捉しています。ひとつめのcatchブロックcatch(MyException1 $e)はMyException1を捕捉するブロックなので、ここでは実行されません。

ネストしてgetPreviousで前の例外情報を取得する

PHP5.3から、例外をネストさせることができるようになりました。例外のネストとは、tryブロックの中に別のtry-catchブロックを記述することを言います。これにより、前の例外の情報を持ちながら別の例外を投げれるようになります。

以下のサンプルでは、内側のtryブロックで発生したMyExceptionをExceptionの第三引数に指定し、外側のcactchブロックで捕捉するように投げています。なお、第三引数に指定した例外は前の例外としてExceptionクラスのgetPreviousメソッドで取得することができます。

サンプルプログラム:

<?php

//Exceptionクラスを拡張
class MyException extends Exception {
}

try {
    try {
        throw new MyException('MyException', 111);
    } catch(MyException $me) {
        //MyExceptionを第三引数$meに指定
        throw new Exception('Exception', 999, $me);
    }
  //指定されたMyExceptionを捉える
} catch(Exception $e) {
    //↓前の例外を取得して$prevに代入
    $prev = $e->getPrevious();
    //前の例外のメッセージ‘MyException’を取得
    echo $prev->getMessage();
    echo "<br>";
    //前の例外のコード111を取得
    echo $prev->getCode();
}

?>

実行結果:

MyException
111

$prev = $e->getPrevious()で前の例外MyException(‘MyException’, 111)を$prevに代入しています。そのため、$prev->getMessage()で”MyException”$prev->getCode()で111が取得できています。

まとめ

今回はExceptionの使い方について解説しました。実際のシステム構築では異常終了を避けるため、例外処理はかかせません。Exceptionの使い方を忘れてしまったら、この記事を思い出して下さい!

この記事を書いた人

世界中の人たちと友達になって、その友達の家を巡る旅をしたいと密かに思っている。

複雑な内容を誰にでもわかりやすく、そして納得のいくような解説をする、をモットーにしています!

目次