例外メッセージにはどのスタイルを使用しますか? [閉まっている]
質問
例外をスローするコードを書く際に、こちら、メッセージの最後に来て、句読点で一時停止しました。私がスローした例外メッセージのほぼすべてに、おそらく!どこかに。
throw new InvalidOperationException("I'm not configured correctly!");
throw new ArgumentNullException("You passed a null!");
throw new StupidUserException("You can't divide by 0! What the hell were you THINKING??? DUMMY!!!!!");
例外メッセージを書くとき、どのようなトーンを取りますか?ログを調べてみると、特定のスタイルのメッセージが実際に他のメッセージよりも役立つと思いますか?
解決
システムメッセージの会話のトーンは、ソフトウェアを専門的でずさんなように見せます。感嘆符、in辱、およびスラングは、洗練された例外メッセージに実際には場所がありません。
また、ランタイム例外は間違いを犯したプログラマーに対処するため、ランタイム例外とチェック例外にはJavaで異なるスタイルを使用する傾向があります。ランタイム例外はエンドユーザーに表示される可能性があるため、引き続き「きれいに保つ」ようにします。しかし、彼らはもう少し簡潔で不可解なことができます。チェックした例外メッセージは、説明するとユーザーが問題を修正できる可能性があるため、より役立つはずです(たとえば、ファイルが見つからない、ディスクがいっぱいで、ホストへのルートがないなど)。
情報の例外に関する特定のフィールドがない場合に役立つのは、問題のあるデータです:
throw new IndexOutOfBoundsException("offset < 0: " + off);
他のヒント
ただ事実の問題です。デバッグ時に必要になる可能性のあるすべての情報を含めますが、それ以上は含めないでください。
例外メッセージに感嘆符を含めるのは、本当に奇妙なことが起こったことを示す場合だけです。ほとんどのエラーは実際には奇妙ではありません、不正確な環境、ユーザーエラー、または単純なプログラミングミスの結果です。
私は、コーディング対象のフレームワークのトーン、文法、句読点のスタイルを反映しようとしています。これらのメッセージの1つが実際にいつクライアントまたはユーザーの前で出てくるかわからないので、トラブルシューティングに十分な専門的、非判断的かつ具体的なものをすべて保持します-セキュリティ問題を特定することなく、コード。
ユニットテストで(偶発的に)例外を除き、ペストのようなすべての文字列(UIおよび例外)で感嘆符を避けます。
責任は、それが本当にユーザーのせいであったとしても、私が見た中で最良の選択肢です。
「必要なファイルが見つかりません。正しいファイルがあるかどうかを確認しますか?」の行に沿ったものまたは&quot;問題が発生しました。 Dunnoなんだけど、修正できる唯一の方法は停止することです。再起動してください。&quot;
簡潔で詳細かつ冗長な情報(つまり、ArgumentNullExceptionは明らかにnullを含んでいた)。
しかし、これは私がしばらく読んだ中で最高のものです、最初の答えはこれ。
感嘆符はあまり使いません。彼らは表現しすぎて、「ドライブにディスクがない!」という事実を考えてください。 「クレイジーユーザーのドライブにディスクがありません」と読むことができます。 ;)
国際化されたテキストを含む例外をスローするのが賢明だと思います。誰がコードを使用し、例外をキャッチし、ユーザーにテキストを表示するのか決してわかりません。 それは次のようになります:
throw new MagicalException(getText("magical.exception.text"));
スローするときに、基になる例外(ある場合)をラップすることもお勧めします。本当にデバッグに役立ちます。
ランタイムの例外がユーザーに表示されるとは思わないでください。ファイルアペンダーにログを記録している場合、好奇心user盛なユーザーがログを開いて dirty シークレットを覗くだけです。
次のような役立つメッセージが見つかりました:
- 一貫性のあるフォーマットにより、彼らがあなたに言っていることを理解しやすくなります。
- タイムスタンプ。プログラムのダイナミクスを感じることができます。
- エラーの簡潔な要約。技術サポートを提供する場合は、すばやく識別できるようにエラーコードを追加してください。
- 間違った原因の説明、無効なユーザー入力とコーディングエラー を区別します。
- コードの行または値を含む詳細情報。
そして最も重要なこと:
- 問題の修正方法をユーザーに伝えます。
例:
Error 203 (Timeout) in commit.c line 42: Unable to save salary data for user 'Linus' to database at '10.10.1.21' after 1500ms. Verify database address and login credentials.
学ぶのが最も難しい教訓の1つは、ユーザーがコードの内部構造に興味を持っているのは、仕事を終わらせることよりもはるかに少ないことです。できる限り簡単にできるようにすることです彼らの仕事、そしてあなたはあなたのソフトウェアに多大な価値を加えました。
私は、例外メッセージを例外自体に組み込む傾向があります。例えば。 file_not_foundは「ファイルが見つかりません」と言う必要があります。特定のデータは、ユーザーが理解できない場合にのみ含める必要があります。この場合、ユーザーはファイル名を知っているため、そのデータは追加しません。フォーマットは、必要に応じて情報を出力するものであれば何でも実行できるため、可能な限り再フォーマットしやすいようにしています。
丁寧で簡潔、シンプル、具体的。多くの場合、メッセージに状態値を含めると役立ちます。