プログラミング言語

【PHP入門⑫】例外処理 ~初心者でも安心!基礎から学べるプログラミング講座~

プログラミング言語

※前回の講座がまだの人はこちら
【PHP入門⑪】継承 ~初心者でも安心!基礎から学べるプログラミング講座~

例外処理

プログラミングをする内に、エラーに出会ったことがあると思います。
初めは、英語の羅列で意味が分からなし、意味が無いものだと思ったかもしれません。しかし、エラー自体には意味があり、そのエラー文のおかげで動かないプログラムを修正することができます。

例外処理とは?

プログラム実行中に発生したエラーのことを例外と言います。例外が発生すると、プログラムが異常終了してしまいます。システム的に異常終了はさせたくないので、例外を検知して、例外が発生した場合に行う処理を用意します。この一連の処理のことを例外処理と言います。結果、エラーは発生しているが、プログラム自体は正常に動作したという状況を作ることができます。

Exception

例外のエラーのことをExceptionと言います。
※厳密には、エラーとは違いますが、初心者は混乱してしまうのでエラーだと思ってくれて大丈夫です。

Exceptionには様々な種類があり、エラーによって発生するExceptionが異なります。
PHPが標準で用意している例外と、SPL(Standard PHP Library)が用意している例外の2種類あります。

※各例外の種類はPHPの公式マニュアルをご覧ください。
PHP標準の例外
SPLの例外

例外処理の使い方

例外を投げる

例外が発生した場合、「例外が発生した」ことを知らせる必要があります。
これを例外を投げると言い、throwを使うことで例外を投げることができます。

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

throw例外クラス名を指定することで、例外を投げてくれます。メッセージは、必要な場合のみ記述すれば良く、該当の例外クラスへメッセージを投げることができます。

ただ、throwするだけでは、例外処理を行うことはできず、投げられた例外を受け取る処理を別途用意する必要があります。

例外処理の構文

try~catch文を使うことで、投げられた例外を受け取ることができます。
tryの中に実行したい処理を書きます。そのtry内で例外が発生した場合(throwされた場合)、tryの処理を中断して、catchへ行きます。finallyが書いてあれば、tryもしくはcatchの処理が終わった後に、finallyの処理が実行されます。(finallyは書かなくても問題ありません。)

try {
  //例外が起こりうる処理
} catch (Exception $e) {
  //例外が起きた時の処理
} finally {
  //例外が起きても起きなくても必ず実行される処理
}

catchで指定する例外クラス名は、tryで発生するであろう例外のクラス名を指定します。変数名に関しては、「$e」や「$ex」を指定することが基本的に多いです。

※注意点
PHPの場合は、throwしないとcatchしてくれません。
Javaの様に勝手にthrowしてくれることは無いので、例外処理を書く場合は、ちゃんとthrowしているか確認してください。

例外処理の実行

実際に例外処理を書いてみます。
除算を行う際、分母に0が来るとエラーになります。(0で割ることは出来ないため)
今回は、分母に0が来たら例外としてthrowするという例外処理を書きます。

<?php
 try {
   $a = 6;
   $b = 2;
   if ($b == 0) {
     throw new Exception("Exception発生");
   }
   $i = $a / $b;
   echo $i;
 } catch (Exception $e) {
   echo $e->getMessage();
 }

$bが0以外の場合は、if文の中には入りません。「6/2」を計算して、結果を表示しています。

<実行結果>
3

$bが0の場合は、if文の中に入ります。すると、throwされてcatchの中に入ります。その場合、tryの残りの処理は実行されません。

<実行結果>
Exception発生

getMessage()はExceptionクラスの関数で、指定したメッセージを受け取ってくれます。

まとめ

例外処理はあまり必要ないかと感じるかもしれませんが、意外と使います。
特に、DB(PDO)を扱う時には、必須の処理になるので使えないと非常に困ります。
独自のExceptionクラスも作ることができるので、慣れてきたら色々試してみてください。

タイトルとURLをコピーしました