はじめに
Java の例外処理で軽視されがちなのが、例外メッセージの書き方です。Javaで例外処理を書いていると、つい「エラーが発生しました」のように、ざっくりした例外メッセージを書いてしまいがちです。
しかし、いざ本番環境で障害が起きたとき、ログに出ているのがこのレベルのメッセージだと、以下のような状態に陥ってしまいます。
- どの処理で失敗したのか分からない
- どんな入力値が原因だったのか分からない
- 再現条件が特定できない
今回は、例外メッセージの書き方についてログとして記載していきたいと思います。
他にも、体系的にJavaを学びたい方には以下の教材がおすすめです:
👉スッキリわかるJava入門
👉スッキリわかるJava入門 実践編
なぜ例外メッセージが重要なのか
例外メッセージは、障害が発生したときに一番最初に見るものとなります。このメッセージで十分な情報がなければ、調査が難航になりがちです。例外メッセージが貧弱だと様々な運用保守上の不具合が発生します。
- 「とりあえず再起動して様子見」が常態化する
- 毎回、同じような障害調査に時間を取られる
- 新しく入ったメンバーがログを見ても何も分からない
良い例外メッセージの条件
良い例外メッセージには次の要素が含まれています。
- どこの処理で失敗したのか(コンテキスト)
- 何をしようとしていたのか(目的)
- どんな値が問題だったのか(パラメータ情報)
- 原因の概要(可能なら)
- 次に何をするべきか(対策のヒント)
悪い例・良い例
悪い例
何が?どこで?なぜ? すべて不明の状態となってしまう。
throw new RuntimeException("エラーが発生しました");
良い例
「どの処理」で「どんな値」で「何が問題」か明記されていると障害箇所が見つけやすくなります。
throw new Exception(
"【ユーザ登録処理】パラメータが不正です。userId=" + userId + " は 1以上である必要があります。"
);
例外メッセージの構成テンプレート
開発中にチーム共通ルールとして、メッセージの構成テンプレートを指定しておくと運用がとても楽になります。
テンプレート例
チームで以下のようなテンプレートを定めておけば、開発者はメッセージを作成時に安易にメッセージを作成することを抑制することができます。
[時刻] 【処理名】{何をしたかったか} 中にエラー。入力値:{パラメータ}。理由:{概要}。
パラメータをどこまで含めるか
含める情報
- 内部ID(一意のキーで特定できる値)
- 数値やフラグ
- 再現するためにに重要な入力情報
含めてはいけない情報
- パスワード
- トークン等
- クレジットカード、メールアドレス
- アプリの内部構造(SQL全展開など)
まとめ
例外メッセージというと、一見地味で優先度の低い部分に思われがちですが、システムの運用フェーズに入ると、その重要性は一気に表面化します。
「どの処理で」「どんな値で」「なぜ失敗したのか」が数行で明確に示されているだけで、原因調査のスピードは劇的に変わります。
記事を参考に、メッセージの内容について見直してみても良いかもしれません。
ドキュメント
【公式ドキュメント】
Java SE Specifications (oracle.com)
最後に
Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)
以上、ログになります。
これからも継続していきましょう!!


コメント