PHPにおけるtry-catch文(例外処理)の使い方を解説します

プログラミング 公開日:
ブックマーク
PHPにおけるtry-catch文(例外処理)の使い方を解説します
try-catchはエラーハンドリングの重要な手段の1つで、本来であれば終了してしまうプログラムの「エラー」を制御するために、try-catchを利用します。本記事では、PHPにおけるtry-catchの使い方を、PHP初心者の方に向けて解説します。

はじめに

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のエラーメッセージ と、それぞれ返却されることがわかります。

まとめ

いかがでしたでしょうか?
少し難しく感じる方もいらっしゃるかと思いますが、システムを構築していく上で、必ず必要な処理になるので、この機会に覚えていきましょう。

TECH PLAYでは、ITに関わる様々なイベント・勉強会・講演会・交流会・カンファレンス・セミナーなどの情報を集約し掲載しています。

テクノロジーと共に成長しよう、
活躍しよう。

TECH PLAYに登録すると、
スキルアップやキャリアアップのための
情報がもっと簡単に見つけられます。

面白そうなイベントを見つけたら
積極的に参加してみましょう。
ログインはこちら

タグからイベントをさがす