例外処理とは?
この記事の動画版はこちら(画像クリックでYoutubeに飛びます)
例外処理とは?
「例外」とは、プログラムが通常の処理の中では想定しないエラーのことを言います。
プログラムの処理が全て想定通りに動いてくれれば何も問題無いのですが、実際に稼働させてみると、必要なパラメーターが渡ってこなかったり、ユーザーによって変なデータが入力されたり、接続しようとしたデータベースが何らかの原因で止まってしまっていたりなど、外的な要因などにより、想定外のエラーが発生することが多々あります。
そういった例外が発生した際にプログラムが不正に中断してしまうのではなく、ユーザーに再入力を促したり、適切なエラー画面を表示するようにしておくことを「例外処理」と言います。
例外はどんな時に起きる?
商品詳細画面を表示しようとした際に、指定されたIDの商品が見つからなかった場合や、そもそもID自体が指定されなかった場合。
注文入力画面や、お問い合わせフォームなどで、必須入力の項目に何も入力しないで送信しようとした場合。
郵便番号や電話番号に数値ではなく不正な文字が入力されてしまった場合。
制限文字数をオーバーした大量の文字が入力されてしまった場合。
データベースに対して処理を行おうとした際に、接続先のデータベースサーバーが止まってしまっていた場合。
などです。
【例外が起こる時】
・指定されたIDの商品が見つからない
・必要なパラメーターが指定されていない
・必須入力項目が未入力
・不正な形式のデータが入力された
・制限文字数をオーバーした
・データベースに接続出来ない
このような例外が起こると、その後のプログラムの処理が正常に実行出来なくなってしまいます。
その結果、真っ白な画面が表示されたり、ユーザーにとって意味不明なエラーメッセージが羅列されてしまうかもしれません。
また、中途半端なところで処理が中断されてしまうことで、不整合データなどが発生してしまう可能性もあります。
そういったことが起こらないように、プログラマーは発生する可能性のある例外に備えた「例外処理」をあらかじめ実装しておく必要があるんです。
例外処理の書き方
例外処理を行うには「try-catch」と「throw」という仕組みを使います。
try { 例外が発生する可能性のあるコード } catch (Exception $e) { 例外が発生した場合に行う処理 }
tryの波括弧で囲んだ中で例外が発生したら、自動的にcatchブロックに飛んでくれるという仕組みです。
つまり、このように一連の処理をtry-catchで囲んでおくと、例えば処理Bで例外が発生した場合、その時点でcatchブロックのエラー画面表示処理に移動してくれるという訳です。
try { 処理A 処理B ←ここで例外が発生! 処理C } catch (Exception $e) { エラー画面表示 }
catchブロックでは、エラー画面の表示以外にも開発者が後から原因を分析出来るようにログを出力したり、不整合データが発生しないように、そこまでの処理で行ったデータ変更を元に戻したりします。
このように、try-catchで例外を補足するようにしておくことで、例外が発生した場合に確実にエラー処理が行えるという訳ですね。
また、エラー処理が1箇所にまとまって定義されるので、ソースコードも見やすくなります。
なお、catchの後ろの引数指定では、補足する例外の種類を細かく指定することも出来ます。
「Exception」と指定しておくと、全ての例外を補足してくれます。
補足する例外の種類によって、エラー処理を細かく分けたい時は、キャッチする引数を変えて、catchブロックを複数指定することも出来ます。
補足した例外の情報は、変数($e)に格納されています。
ログを出力する際などは、この変数から「エラーコード」や「エラー内容」などを取得します。
try { 例外が発生する可能性のあるコード } catch (Exception $e) { 例外が発生した場合に行う処理 }
また、例外はプログラマーが任意に発生させることも出来ます。
例えば、「指定されたIDの商品が見つからない」といった状況をエラーとするのかどうかはPHPは判断出来ないため、これを例外として処理したい場合は、プログラマーが任意に例外を発生させてあげる必要があります。
ここで使うのが「throw」という命令です。
このように書くと、例外を新規に発生させることが出来ます。
throw new Exception(エラーメッセージ, エラーコード);
例外を任意に発生させた場合も、発生させた時点でcatchブロックに移動しますので、例えば、商品が取得出来なかった場合に、このようにthrowすれば、catchブロックに飛びエラー画面が表示されるという訳です。
例外処理は、このように「try-catch」と「throw」を使って実装すると覚えておきましょう!
まとめ
・例外とは、プログラムが通常の処理の中では想定しないエラーのこと
・例外処理とは、例外が発生した場合にもプログラムが不正に中断しないように、適切な処理を施すこと
・例外処理には「try-catch」を使う
・tryの中では「throw」を使って任意に例外を発生させることも出来る
要求された機能をただ作るだけでなく、こういった想定外の事態も考慮して、適切な例外処理を施すようにしましょう!