2023年内に個人開発でサービスをローンチしたい人のブログ

なんちゃってphperですが、「2023年内に個人開発でサービスをローンチする」ことを目標にがんばります!とはいっても、ブログはノンジャンルです。

PHP 例外処理( try ~ catch ~ finally )の書き方

こんにちは。唐突ですが、技術の備忘録もちょこちょこ書いていこうと思います。


例外処理の書き方

プログラム内の例外処理を検知して、別の処理へ分岐させる役割を持っています。 そもそも例外処理とは、プログラムの処理中に想定外のエラーが発生された際に実行される処理のことです。

その際に、try ~ catch ( ~ finally)文、throw文を使用します。

  • 例外処理が発生しうる処理に対して、try ~ catch ( ~ finally)文を使用します。
  • tryブロック内で、throw文を記載し、例外を検知してcatchブロック内の処理へ分岐させます。

try ~ catch ( ~ finally) について

try ~ catch ( ~ finally)文の使い方は以下の通りです。

  • 例外の発生を想定する処理に対して、tryブロックで囲みます。
  • 例外が発生した場合の処理を、catchブロック内に記載します。
  • 例外処理・通常処理のどちらでも最後に実行したい処理がある場合は、finallyブロック内に記載します。

throw について

  • try ~ catch ( ~ finally)文のtryブロック内で、throw文を使用します。
  • 例外が発生した際にthrow文の処理を通すことで、catchブロックへ分岐させます。
  • 上記のthrowの処理を、投げる(スローする)と表現します。

書き方

  • tryブロック内には、対応する catchブロック もしくは、finallyブロックが存在する必要があります。
try {
    // 「例外の発生を想定する処理」を記載

    // 例外が発生した際に、例外処理を捕まえてcatchブロックへ分岐させる(=投げる、スローする)
    throw new Exception();
    // throwをした場合、tryブロック内の以降の処理は通らない

} catch(Exception $e) {
    // 「例外処理が発生した際に実行する処理」を記載

} finally {
    // 「通常処理、例外処理のどちらでも最後に実行したい処理」を記載
}
  • finallyブロックは不要であれば、記載なくても大丈夫です。
try {
    // 「例外の発生を想定する処理」を記載

    // 例外が発生した際に、例外処理を捕まえてcatchブロックへ分岐させる(=投げる、スローする)
    throw new Exception();
    // throwをした場合、tryブロック内の以降の処理は通らない

} catch(Exception $e) {
    // 「例外処理が発生した際に実行する処理」を記載

}

例文

例1

try {
    // 「例外の発生を想定する処理」を記載
    echo '処理開始\n'

    // 例外が発生した際に、例外処理を捕まえてcatchブロックへ投げる
    throw new Exception('エラー発生しました');

    echo '正常処理\n';

} catch(Exception $e) {
    // 「例外処理が発生した際に実行する処理」を記載
    // 例外メッセージを取得します。(Exception::getMessage)
    echo $e->getMessage().'\n';

} finally {
    // 「通常処理、例外処理のどちらでも最後に実行したい処理」を記載
    echo '全処理終了\n';
}

実行結果

処理開始
エラー発生しました
全処理終了

解説

  • まずtryブロックの処理を通ります。
  • throw文を通るため、catchブロックへ分岐します。
  • そのため、tryブロックの以降の文( = echo '正常処理'; )は、通りません。
  • catchブロックの処理を通り、$e->getMessage()で、投げられた'エラー発生しました'の文字を取得し出力されます。
  • catchブロックの処理を終えると、finallyブロックの処理を通るので、全処理終了が出力されます。

例2

// 引数二つを掛け算する処理
function kakezan($a, $b) {
    try {
    // 「例外の発生を想定する処理」を記載
    
    if (!is_numeric($a)) {
    // 例外が発生した際に、例外処理を捕まえてcatchブロックへ投げる
        throw new Exception('第一引数でエラーが発生しました');
    }
    
    if (!is_numeric($b)) {
    // 例外が発生した際に、例外処理を捕まえてcatchブロックへ投げる
        throw new Exception('第二引数でエラーが発生しました');
    }
    
    return $a * $b;
    
    } catch(Exception $e) {
    // 「例外処理が発生した際に実行する処理」を記載
    // 例外メッセージを取得します。(Exception::getMessage)
        return $e->getMessage().'\n';
    
    }
}

// 掛け算結果を出力
echo '実行結果:'.kakezan(1, 2).'\n';
echo '実行結果:'.kakezan('test', 2).'\n';
echo '実行結果:'.kakezan(1, 'test').'\n';

実行結果

実行結果:2
実行結果:第一引数でエラーが発生しました
実行結果:第二引数でエラーが発生しました

解説

  • 関数を実行時にtryブロックの処理を通ります。
  • 引数が数字でない場合、throw文を通るため、catchブロックへ分岐します。
  • 引数が数字でない場合は、$e->getMessage()で、投げられた'~でエラーが発生しました'の文字を結果に返します。
  • 引数が数字の場合は、正常に処理を行い、引数を掛け算した結果を返します。

参考にさせていただいたサイト


あとがき

技術系の備忘録記事を書いてみました。 何かしらかけるだろうと思って書き始めたのですが、自分は理解しているようでちゃんと理解していないことだらけだと痛感しました。 そのため、ブログでアウトプットするってのは情報整理ができて、理解において大切なことだと感じました。そして、技術ブログを書いている方々はありがたい存在だと気づかされました。 その人たちを目標に、これからもこつこつ続けてまいります。

読んでいただきありがとうございました。 よろしくお願いいたします。