PHPにおけるtry-catch文(例外処理)の使い方を解説します
はじめに
try-catchは、プログラミングにおけるエラーハンドリングの重要な手段の1つです。
異常終了により処理が継続できないということを防ぐため、本来であれば終了してしまうプログラムの「エラー」を制御するために、try-catchを利用します。
本記事では、PHPにおけるtry-catchの使い方を、PHP初心者の方に向けて解説します。
try-catchの基本的な使い方
PHPでのtry-catchの基本的な使い方は、次の通りです。
try {
// 例外が発生する可能性のあるコード
} catch (Exception $e) {
// 例外が発生した場合に行う処理
}
もう少しイメージを膨らませるために、サンプルコードも合わせて見ていきましょう。
下記は、渡された値を10で割った結果を返却するコードです。
$number = 2;
echo "処理を開始します。" ."<br>";
try {
$result = 10 / $number;
echo "10を" .$number ."で割った結果は" .$result ."です。<br>";
} catch(Exception $e) {
echo $e->getMessage() ."<br>";
}
echo "処理を終了します。";
実行結果は、
処理を開始します。
10を2で割った結果は5です。
処理を終了します。
となります。
上記の処理に0が渡された場合、0を除算することはできないため、例外(Exception)エラーがcatchされ、
処理を開始します。
Division by zero
処理を終了します。
の内容が返却されます。
もしtry-catchがなかった場合、例外エラーが発生し、その時点で処理が終了します。
$number = 0;
echo "処理を開始します。" ."<br>";
$result = 10 / $number; // この時点で例外エラーが発生し、処理が強制終了する
echo "10を" .$number ."で割った結果は" .$result ."です。<br>";
try-catchの便利な使い方
エラーメッセージをカスタマイズする
先ほどの例では、デフォルトのエラーメッセージ(Division by zero)をそのまま返却していましたが、少しメッセージとしては分かりづらい表示になってしまっています。
事前に例外が予測される場合、Exception発生時に表示するメッセージを設定しておくことで、分かりやすいエラーメッセージを返却することができます。
$number = 0;
echo "処理を開始します。" ."<br>";
try {
if ($number === 0) {
throw new Exception("入力された値が0のため、計算ができませんでした。処理は継続します。");
}
$result = 10 / $number;
echo "10を" .$number ."で割った結果は" .$result ."です。<br>";
} catch(Exception $e) {
echo $e->getMessage() ."<br>";
}
echo "処理を終了します。";
【実行結果】
処理を開始します。
入力された値が0のため、計算ができませんでした。処理は継続します。
処理を終了します。
処理を終了させる
ここまでcatchした場合、処理を継続させるコードを書いてきました。
一方で例外エラーが発生した場合、原因追跡のためのログを吐いた上で、処理を中止させることも多いかと思います。
$number = 0;
echo "処理を開始します。" ."<br>";
try {
if ($number === 0) {
throw new Exception("入力された値が0のため、計算ができませんでした。処理を中止します。");
}
$result = 10 / $number;
echo "10を" .$number ."で割った結果は" .$result ."です。<br>";
} catch(Exception $e) {
echo $e->getMessage() ."<br>";
exit();
}
echo "処理を終了します。";
<実行結果>
処理を開始します。
入力された値が0のため、計算ができませんでした。処理を中止します。
try-catchをネストさせる
try-catchはネスト(入れ子)にして、実行することも可能です。
下記コードは、渡された値に対して、順番に「加算」「除算」「減算」するコードです。
echo "処理を開始します。" ."<br>";
try {
try {
$result1 = $number + 1;
echo "10に" .$number ."を足した結果は" .$result1 ."です。<br>";
$result2 = 10 / $number;
echo "10を" .$number ."で割った結果は" .$result2 ."です。<br>";
$result3 = 10 - $number;
echo "10を" .$number ."で引いた結果は" .$result3 ."です。<br>";
echo "処理を終了します。";
exit();
} catch(Exception $e) {
echo $e->getMessage() ."<br>";
}
throw new Exception('異常終了しました。');
} catch(Exception $e) {
echo $e->getMessage() ."<br>";
exit();
}
まずは上記に2を渡してみます。その場合の実行結果は、
処理を開始します。
10に2を足した結果は3です。
10を2で割った結果は5です。
10を2で引いた結果は8です。
処理を終了します。
となります。
次に0を渡して、除算時に例外エラーが発生するように実行すると、
処理を開始します。
10に0を足した結果は1です。
Division by zero
異常終了しました。
「Division by zero」は内側のtry-catchのエラーメッセージ、「異常終了しました。」は外側のtry-catchのエラーメッセージ と、それぞれ返却されることがわかります。
まとめ
いかがでしたでしょうか?
少し難しく感じる方もいらっしゃるかと思いますが、システムを構築していく上で、必ず必要な処理になるので、この機会に覚えていきましょう。