CAUTION!
- 当記事はイベントのLTで発表したものです
- システムの開発方針によっては紹介する実装が適さないことがあります
- 実装例はPHPですが、簡易なコードなのでプログラミング言語を問わずお読みいただけます
※ @error_401さんからコメントを頂きました。ご指摘ありがとうございます!
- 紹介する実装は保守性が下がる可能性があります
- 専用の例外クラスを作成する際は、エラーの対象範囲をよく検討してください
自己紹介
- Webエンジニア歴4年
- 主な使用言語はPHP
- たまにITイベントにスタッフ参加しています
伝えたいこと
特定エラー専用の例外クラスを作ると、エラー発生後の分岐処理が実装しやすいです!
例外処理とは
プログラムの実行中に発生した問題・エラー(例外)を解決するため処理
例外処理では何を行うのか
- ロールバック
- 画面上へエラーメッセージを表示する
- 関係者宛にツールやメールで通知する
- エラーログに記録する
ロールバック
不安定な状態でデータベースへレコードが保存されるのを防ぐ
画面上へエラーメッセージを表示する
ユーザーへ通知して何かしらの操作を促す
関係者宛にツールやメールで通知する
問題が発生した直後に関係者による何かしらの対応を促す
エラーログに記録する
原因を調査し問題を解決する
結論
- 次の行動につながる処理を行う
- やるべき行動・処理はエラーの種類によって異なる
PHPで例外処理を実装する
基底クラスのみで例外をキャッチする
要件
- 記事の投稿処理でエラーが発生した場合は画面にエラーメッセージを表示したい
実装
try {
$article = new Article('hogehoge');
$article->create();
} catch (Exception $e) {
return display_message($e->getMessage());
}
return display_message('記事の投稿に成功しました');
解説
- エラーの種類を問わず例外が発生した場合は同じ処理を行う
- 例外は基底クラスによる一律キャッチでOK
要件が追加されたら?
- 記事のアップロード処理でエラーが発生した場合は担当者へ通知したい
- それ以外のエラーはログに記録したい
先述の方法では実装が難しい...
特定エラー専用の例外クラスを追加して例外をキャッチする
実装
try {
$article = new Article('hogehoge');
$article->create();
} catch (ArticleUploadException $e) {
notify_alert($e, debug_backtrace()); # 担当者へ通知
return display_message($e->getMessage());
} catch (Exception $e) {
record_log($e, debug_backtrace()); # ログに記録
return display_message($e->getMessage());
}
return display_message('投稿に成功しました');
解説
- 記事のアップロード処理でエラーが発生した場合は専用の例外を投げる
- アップロード処理エラー専用の例外をキャッチした場合は担当者へ通知する
- それ以外の例外(基底クラス)をキャッチした場合はログに記録する
例外クラスの種類が増えたら
結論
特定エラー専用の例外クラスを作成すると、エラー後の分岐処理が実装しやすくなる
おまけ
例外のメッセージはそのまま出力してOK?
メッセージの内容は様々
- 必ずしも画面表示に適したフォーマットではない
- 英語の可能性が高い
- ライブラリ・フレームワーク独自の例外は開発者向けの文言がセットされていることも
結論
- 例外を一律でキャッチしてそのままメッセージを表示するのはやめよう
- 例外の仕様を把握し、メッセージを画面上へ表示させるか、開発者用のログに記録すべきかなどを検討しよう
まとめ
- 適切な例外処理はユーザー・開発者の両方を幸せにします
- ご清聴・ご精読ありがとうございました!