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()で、投げられた
'~でエラーが発生しました'
の文字を結果に返します。 - 引数が数字の場合は、正常に処理を行い、引数を掛け算した結果を返します。
参考にさせていただいたサイト
- 例外(exceptions) - php.net
- Exception::getCode - php.net
- PHPで例外処理を使う方法を現役エンジニアが解説
- 忘れっぽいエンジニアのPHPリファレンス - 例外処理をする
- ユーニックス総合研究所|なるぽのブログ - PHPのtry~catch文(例外処理)の使い方
- 【PHP】try-catch解説 - qiita
あとがき
技術系の備忘録記事を書いてみました。 何かしらかけるだろうと思って書き始めたのですが、自分は理解しているようでちゃんと理解していないことだらけだと痛感しました。 そのため、ブログでアウトプットするってのは情報整理ができて、理解において大切なことだと感じました。そして、技術ブログを書いている方々はありがたい存在だと気づかされました。 その人たちを目標に、これからもこつこつ続けてまいります。
読んでいただきありがとうございました。 よろしくお願いいたします。