役立つエラーメッセージに関する開発者の問題は何ですか?[閉まっている]


29

今日でも、プロのチームによって構築された、長年使用されてきた製品が、今日までまだ、ユーザーに役立つエラーメッセージを提供できないことに驚かされます。場合によっては、ほんの少しの追加情報を追加するだけで、ユーザーの時間を節約できます。

エラーを生成するプログラムが、何らかの理由で生成しました。何が失敗したのか、ユーザーにできる限り多くの情報を提供するために、すべてを自由に使用できます。それでも、ユーザーを支援する情報を提供することは優先度が低いようです。これは大きな失敗だと思います。

1つの例はSQL Serverからのものです。使用中のデータベースを復元しようとすると、まったく問題が発生します。SQL Serverは、どのプロセスとアプリケーションがそれにアクセスしているかを知っています。データベースを使用しているプロセスに関する情報を含めることができないのはなぜですか?すべての人がApplicatio_Name接続文字列で属性を渡すわけではないことは知っていますが、問題のマシンに関するヒントさえあれば役立つかもしれません。

別の候補であるSQL Server(およびmySQL)は、美しいstring or binary data would be truncatedエラーメッセージと同等のものです。多くの場合、生成されたSQLステートメントの単純な閲覧と、テーブルが原因の列を示します。これは常に当てはまるわけではありません。データベースエンジンがエラーを検出した場合、なぜその時間を節約できず、どの列が壊れているかを教えてくれないのでしょうか。この例では、それをチェックするとパフォーマンスが低下する可能性があり、これがライターを妨げると主張できます。結構です、私はそれを買います。データベースエンジンは、エラーがあることを認識すると、格納される値と列の長さを事後比較します。次に、それをユーザーに表示します。

ASP.NETの恐ろしいテーブルアダプタも有罪です。クエリを実行し、どこかで制約に違反していることを示すエラーメッセージを表示できます。ありがとう。開発者は行番号やサンプルデータを提供するのが面倒なので、データモデルとデータベースを比較する時間です。(記録のために、私は選択によってこのデータアクセス方法を決して使用しませんでした、それはただ私が継承したプロジェクトです!)。

C#またはC ++コードから例外をスローするたびに、手元にあるすべてのものをユーザーに提供します。それを投げる決定が下されたので、私が提供できる情報が多ければ多いほど良いです。関数が例外をスローしたのはなぜですか?何が渡され、何が期待されましたか?例外メッセージの本文に意味のあるものを入れるには少し時間がかかります。地獄、それは何もしませんが、私のコードは意味のあるものを投げることを知っているので、私が開発する間、私を助けます

複雑な例外メッセージをユーザーに表示すべきではないと主張することができます。私はそれに反対しますが、それはあなたのビルドに応じて異なるレベルの冗長性を持つことで簡単になだめることができる議論です。それでも、ASP.NETおよびSQL Serverのユーザーは一般的なユーザーではなく、問題をより迅速に追跡できるため、冗長でおいしい情報に満ちたものを好むでしょう。

開発者がエラーが発生したときに最低限の情報を提供することは、この日と年齢で大丈夫だと思うのはなぜですか?

それは2011年の男だ、来る


11
うわー、それは非常に暴言です。
ジョージマリアン

3
@George、適切なエラーがあればもっと速く解決できたはずの何かを追跡するのに長い時間を費やしてきたと言えますか?:)
Moo-Juice

4
深呼吸、おそらくヨガと瞑想をお勧めします。:)(それは言った、私はあなたの気持ちを正確に知っています。)
ジョージマリアン

2
+1-「文字列またはバイナリデータが切り捨てられる」ことは常に私を夢中にさせます!
k25

回答:


22

単にあるべきではない悪いエラーメッセージの例はたくさんありますが、見たい情報を常に提供できるとは限らないことを覚えておく必要があります。

あまりにも多くの情報を公開することに対する懸念もあり、開発者は注意を払ってエラーを起こす可能性があります。(しゃれは意図されていなかったと約束しますが、気づいたので削除しません。)

場合によっては、複雑なエラーメッセージがエンドユーザーにとって役に立たないという事実もあります。情報の過負荷でサイディングすることは、エラーメッセージに対して必ずしも良いアプローチではありません。(ログに保存するのが最適かもしれません。)


+1情報過多の側面についても考えていませんでした。
ライアンヘイズ

私は自分の投稿で、エンドユーザーに対する冗長性が彼らにとって役に立たないかもしれないと感じる人がいる理由を理解できると説明しました。しかし、API(ASP.NETのアダプター)のエンドユーザー、またはデータベースエンジン(SQL-Server)は詳細なエラーを望んでいないと言っていますか?潜在的に何時間もの失われた時間を節約する何か?ちなみに、私はしゃれが好きでした:)
Moo-Juice

1
@George、情報のオーバーロードとエンドユーザーにとっての有用性に関しても、ワードプロセッサのユーザーに完全なスタックトレースをスローしないケースを見ることができます。彼らはインターネットを削除したと思います。ただし、ログファイルに複雑な情報を含む優れた代替手段を提供しました。そのメッセージが今やるべきことはaddだけFor further information, see log20111701.txtです。これは正しい方向への一歩です。
Moo-Juice

2
@moo最終的に、私が言っているのは、批判するのは簡単だということです。(私は知っていますが、頻繁に行います。)ただし、エラーメッセージに含める情報量を伝えるのは必ずしも簡単ではないことを念頭に置いてください。デバッグ中に元々予想していたよりも詳細な情報をバックアップして出力しなければならないことが何度もあります。また、エラーメッセージが、作成時に予想していたほど有用ではなかった場合がたくさんあります。
ジョージマリアン

1
@moo問題の核心は、どれだけの情報が役立つかが必ずしも明らかではないということです。あなたが提供する例はかなり明白に見えます。ただし、それを一般的なケースに拡張するのは簡単ではありません。
ジョージマリアン

21

開発者はエラーメッセージを書くのにふさわしい人ではありません。

彼らはアプリケーションを間違った角度から見ています。彼らは、コード内で何が間違っていたかを非常によく知っていますが、何かを達成しようとする観点からソフトウェアに近づかないことがよくあります。その結果、開発者にとって重要な情報は、ユーザーにとって必ずしも重要な情報ではありません。


+1多くのフレームワーク/ APIエラーの場合、問題の一部はライブラリの開発者がコンテキストを認識できないことです。とはいえ、OPは主に「何かが間違っているが、私が知っていてもどこにいるかは伝えません」という種類のエラーメッセージに関心があるようです。セキュリティだと思いますか?
MIA

8

慈善の視点:

  • 開発者はコードと緊密に連携し、コードの操作に理解がない人を理解するのに苦労しました。その結果、彼らが考えて、彼らはちょうどそれらを判断することで、参照の良いフレームを持っていない、エラーメッセージが細かいです。

  • インテリジェントエラーメッセージは実際には実行が困難です。それらを書くだけでなく、間違っている可能性のあるものすべてを解決し、可能性を評価し、メッセージを読んでいる人に有益な情報(ほぼ確実にコンテキストによって異なる)を提供して、修正できるようにする必要があります。

  • ほとんどのアプリケーションでは、エラーがそれほど頻繁に発生しないため、次の開発者が本当に望んでいるのと同様に、この種のことを行う時間について良いケースを作ることは困難です。また、余分な時間があった場合は、エラーを報告するのではなく、エラーの停止に費やすべきではありませんか?

変更不可能なビュー:

  • エラーメッセージとエラー処理は退屈で、取り組むべきはるかに興味深いものがあり、上司は次のことについて私の背中にいます。私はこのコードを理解しています、私は大丈夫です、次の人は最終的にそれを解決します、そして私はその時までにここから出るので、それは私の問題ではありません。

現実はおそらく中間のどこかにありますが、私の経験では実際には後者よりも前者のほうがはるかに多いと言っています-基本的には実際には非常に難しく、おそらく起こらないことを扱うにはかなりの努力が必要です。


多くのエンドユーザーの場合、どこから来ているのか理解しています。ただし、元の投稿で説明したケースは、データベースに対してコードを記述しているときに頻繁に発生する可能性があります。ワードプロセッサやコンピューターゲームなどのエンドユーザーアプリケーションに関しては、通常、何か悪いことが起こっていない限り、エラーは発生しないはずです。その場合でも、エラーはエンドユーザーには何の意味もありません(Process Handle Raped By Spawned Injector, Quitting SYstem.....ユーザー: "wtfでしたか?`)。しかし、SQL Server / ASP.NETの場合、もっと努力できたと思います:)
Moo-Juice

@ Moo-Juice-それは「エラーメッセージは難しい」こと全体に帰着すると思います。オプティマイザーが実行した後、実際にデータベースにスローされる内容は、あなたが投げたものと非常に似ているだけです。エラーを特定することは一つのことであり、あなたが渡したものに何が起こったのかをさかのぼることは完全に別のものであり、決して些細なことではありません。
ジョンホプキンス

いくつかのケースは簡単ではないかもしれません。string/binary dataこのテーブルからすべての列情報を取得し、過去の値を調べて、どの列が違反していたかを示すエラーをキャッチする単純なコードのどこかです。これは簡単でした。たぶん、私の例は些細なことなので、私はあまりにもひどいです。しかし、これは必ずしもそうではないことを完全に理解しています。生成されたインジェクターがレイププロセスを停止するのは難しいかもしれません:)
Moo-Juice

6

残念ながら、より有用なエラーメッセージは開発者の時間を要します。これは会社のお金に匹敵します。製品は、そのままビルドするのに十分高価です。はい、もっと役立つエラーメッセージがあれば素晴らしいでしょうし、もっと役立つエラーメッセージを含めるべきだということに同意します。しかし、それは人生の事実であり、あなたが期限内にいて、お金が限界にあるとき、あなたは何かを切らなければなりません。「きれいなエラーメッセージ」は、管理者が見るかもしれませんが、おそらく最初に行くことです。


ああ、いいですね。それは今までコストの懸念を提示します。
ジョージマリアン

私はコストの観点を認めることができます(そして、それを気にする、それは私がそれを好きにしなければならないという意味ではありません)。私は、SQL ServerまたはASP.NETの開発者の観点から話すことはできませんが、私はそれがかからないことを知っているその列名を提供するために、多くの余分な努力を。私の簡単な例では、1時間で解決するかもしれません。次に、生成される可能性のある他の1000個のエラーがあります。しかし、彼らは少なくとも一般的なものから始めることができます:)
Moo-Juice

もちろん、SQLサーバーの内部はわかりませんが、一般的に言えば、エラー状況が検出された時点で、これらの情報が手元にないことがよくあります。「文字列またはバイナリデータ」のような定式化により、エラーサイトでは、切り捨てられた値が文字列であるか数字であるかが明確ではないことが明らかになります
...-Ichthyo

あるレベルでは、これは有効かもしれませんが、同じ問題は単純に$を追加する単純なperlスクリプトでも発生します。エラーメッセージに非常に役立ちます。これは、ライトに(開発者の時間的に)安いです:それは全く役に立たない書き込みをするよりも、「ダイ『を開くことができませんでした$パス』」「ダイ『$パス$!』」
ウィリアムPursell

6

エラーメッセージはできるだけ具体的にする必要があることに同意します。

一般的なエラーメッセージの理由の1つは、おそらくエラーコードの使用です。例外を使用する場合、エラーメッセージで必要なものすべてを自由に渡すことができます。戻りコードを使用すると、列名をエンコードする余地がありません。おそらく、エラーは、コンテキストを知らず、エラーコードを文字列に変換するだけの汎用関数によって処理されます。


さらに悪いことに、非常に特定のポイントでエラーをトリガーできますが、エラーを処理するために、いくつかの可能性を状況のクラスに組み込み、1回の回復でそれらを処理する必要があります。この一般化の行為により、多くの場合、不足している追加のコンテキスト情報をさらに廃棄することが強制されます。
イクショー

ところで...のクラス全体にこのメカニズムリード面白いのエラーメッセージ: -の線に沿って「いいえエラーが検出された重大な障害-567モジュールではdwarf678」
Ichthyo

4
  • 情報が多すぎるとセキュリティリスクになる場合があります。あなたは誰がエラーメッセージを読んでいるかわからない
  • 例外をスローした操作が非常に複雑なため、コードの速度/複雑さに悪影響を与えずに意味のあるメッセージを取得できない場合があります

コードでスローされた例外の詳細度を変更できるようにする最初のポイントに答えました。この時点でエラーが発生し、速度が決定要因(imho)ではなくなったことを考えると、2番目のポイントは意味がありません。また、例外をスローする前に詳細なエラーメッセージを生成するためにパフォーマンスへの影響が必要な場合は、同意します。そのコードを、例外がスローされた後に移動します。適切なエラーメッセージに対する有効な引数としてこれらのポイントのいずれも表示されません:)
Moo-Juice

確かに、私はあなたが何の何かの起こったのではなくキープトラック一度情報を検索することができると仮定かもしれません必要があります。ただし、ネストされたループを使用している場合、インデックス/インデックスをキャプチャすることには問題があります。
StuperUser

同意しない最初のポイントについては-1、2番目のポイントについては+1。
ジョンホプキンス

1
@jonログインエラーの一般的なエラーメッセージと、実際に何が問題だったかを示すより具体的なエラーメッセージを対比します。例:「ユーザー名とパスワードの組み合わせが見つかりませんでした」対「間違ったパスワードを入力しました。」/「そのユーザー名は存在しません。」エラーメッセージが暗号化キーのクラッキングに実際に役立つASP.NETの脆弱性を思い出すようです。
ジョージマリアン

@ジョージ-私はその例に同意しますが、それが広まっているとは思いません。アプリケーションへのアクセスが許可されると、(a)許可され、(b)実際のアプリケーションから必要なもののほとんどを取得できると想定できるため、一定レベルのリスクはなくなります。
ジョンホプキンス

3

一般的な通知として、エラーまたは例外的な状況は、まさにそれである例外的であると考えるべきです。計画および設計された手順を横断します。動作するように計画された方法とは互換性がありません。これが当てはまらない場合は、エラーアボートで救済する必要はありません。

私たちプログラマーは、この計画された手順の自己保護に注意するように訓練されています。したがって、仮定を検証するために、定期的にいくつかの健全性チェックを含めます。これらの健全性チェックが失敗すると、計画が何らかの形で失敗したことがわかります...

そのようなシステムがどのように機能するかの現実を考慮すると、ユーザーの観点からは、ユーザーの観点からは常識のように見えるかもしれませんが、それを実現することは不可能です。整然とした適切な情報を追加した整然とした声明を求めます。さらに、このプレゼンテーションは、一般的なアプリケーション/処理設計に適合する方法で行われることを要求します。明らかに、この情報はシステムのどこかに存在します。明らかにそれは整然とうまく組織化された方法でそこに存在します(そうすることを望みます)。しかし、エラーが発生した時点で、この情報を利用できるようにする予定はありません。エラーは常に制御の部分的な喪失です。この制御の喪失は、さまざまなレベルで発生する可能性があります。実行時のシステムの動作が計画と異なる場合があります。しかし、実際の実装は計画よりもはるかに難しく、詳細が異なることが判明した可能性があり、この状況を満足に処理するための余裕のある規定はありませんでした。これも制御の部分的な喪失です。

これを指定した具体的な例に関連付けるには、エラーの時点で、テーブル列の名前とタイプ、さらに必要なスペースの長さがわかっていれば、理由はありません。エラーが発生しませんか?状況を修正して、計画どおりに進めることができます。エラーが発生することを余儀なくされているという事実は、問題が紛失したことを示しています。これらの情報が手元にないというまさに事実は例外です。

ここで書いていることは、自明であり、単なる常識のように思えるかもしれません。しかし、実際には把握するのは非常に困難です。私たちは常に道徳的なカテゴリーを適用することでそれを理解しようとします -犯人がいるに違いない、貧しいユーザーを気にしない悪い怠け者がいるにちがいない、安価な計算の方法を行った貪欲なビジネスマンがいるに違いない これはすべて、ポイント以外の完全なものです

コントロールを失う可能性は、私たちが計画的で規則正しいやり方で物事をしているというまさに事実から生じます


私は反対しなければなりません。何かが間違っていることを知っています(操作を実行できません)。何かが間違っていることを知ることは、それが間違っている理由を知ることを意味します。この文字列は、その列(またはそのテーブルの列)にとって大きすぎます。多くの作業をせずに私に伝えることができます。それはひどいエンタープライズデータベースエンジンです。それは知っています。しかし、それはその情報を中継しません。プログラマは、データベースエンジンが同じことを行うことができることを示す事実を確認した後に実行するクエリを作成できることを考えます。これらは、文書化されていない秘密のファセットではありません。くだらないエラーメッセージ:)
Moo-Juice

へえ...あなたは、理性的な思考ではなく論理に基づいて議論をするべきです。いつからコンピューター何かを知っているのですか?これはハリウッド映画ではありません。プログラムは厳格な、事前に準備されたセットアップであり、前提が破られると、コントロールが失われます。これを把握するのは本当に難しいですか?コンピューターはプログラムを理解していないため、いつプログラムがうまくいかないかを理解できません。ほとんどの場合、一貫性チェックがトリガーされると、実行はすでに数千のステートメントによって進行しており、どのデータが既に破損しているかは誰にもわかりません。できることはダメージを制限することだけです
イクショー

2

私はソフトウェア会社のサポートエンジニアとして働いていますが、よくあるエラーメッセージが表示されます。これらを開発チームに紹介する際に、アプリケーションのソースでメッセージを検索する必要がよくあります。

ユーザーに提示されていなくても、開発チームが新しいものを追加するたびにエラーメッセージインデックスのドキュメントまたはデータベースにメモを追加すると、私たちにとってはかなり安全だと思われます顧客の問題の原因を見つけて時間を節約するために、はるかに迅速に...


1
申し訳ありませんが、それは非常に非現実的です。インデックスドキュメントを管理し、正確に保つ責任は誰にありますか。コードとは別に書かれたドキュメントのように、それは古く、書かれた瞬間に新しいエラーのソースを入手し始めます。
イクショー

それどころか、それは、各エラーに一意の番号があり、それぞれの説明も(特別にフォーマットされた)コメントの形式またはコードとしてコード内にある場合、スクリプトがソースコードから抽出できる種類です文字列。そのため、ドキュメントは各ビルドで自動的に生成されます。抽出されたメッセージは、エンドユーザーに見せたいものよりもかなり詳細になる可能性があります。悪くないアイデア!
ジャンヌ

そのためのスクリプトは必要ありません。多くのランタイムシステムは、行番号などの情報を記録できます。残念ながら、これは元の問題には役立ちません。このように、例外が検出された場所を知っているだけで、何が間違っていたかはわかりません。後者を見つけることはデバッグと呼ばれます-実際には、これは多かれ少なかれ退屈で作業集約的なタスクであり、人間によって行われます。
イクショー

私は@Jeanneと一緒にいます。コードに組み込むか、エラーコードとその解釈を含むコードに中心的なインデックスを作成するのに十分簡単です。例外が検出された場所がわかったら、コード内の何かを追いかける必要があるのではなく、どこかで環境に問題があることを伝えるのに十分かもしれません。
グレナトロン

2

そこに見られる問題は、適切なカプセル化と情報隠蔽の副作用の1つです。

現代のシステムは非常に複雑です。平均的な開発者が、特定のタスクをコーディングしている間、UIから生のバイナリまでのシステム全体のメンタルモデルを頭の中で保持できる可能性はほとんどありません。

したがって、開発者が座って、たとえばデータベースファイルを復元するビットをコーディングしている間、彼のメンタルモデルは、データベースファイルを復元する行為を取り巻くビットで完全に満たされます。彼は、ファイルの読み取り、プロパティの確認、バージョンの読み取り、既存のデータのバックアップ、マージ/上書き戦略の選択などを行う必要があります(このコードを書いていないと思います)。 UIを考慮して、例外ハンドラーに書き込むエラー文字列に含まれます。何かのようなもの:

catch (IOException error)
{
//File is in use
throw new GenericExceptionParsedByTheUIThread("File is in use.");
}

この例では、ファイルまたはDB内の他のスレッドを使用している可能性のあるプロセスに関して尋ねている有益な情報は、完全に(プログラム的に)範囲外です。DBファイルを処理するクラスが数百ある場合があります。ファイルを使用して他のすべてのプロセスに関する情報をファイルにインポートするか、ファイルシステムにアクセスして実行中の他のプロセスを調べる機能(これらのプロセスがTHISマシン上にあると仮定)は、リーキーアブストラクションと呼ばれるものになります。生産性に直接的なコストがかかります。

そのため、現代ではこのようなエラーが持続する可能性があります。明らかに、それらはすべて修正できました。しかし、多くの場合、考えられるよりもはるかに多くのオーバーヘッドがあります(この場合、たとえば、この関数がネットワーク接続と共有の列挙を走査して、リモートマシンがこのデータベースファイルを使用しているかどうかを確認する必要があります理由)そして費用は些細なことからほど遠い。


@GWLlosa、これは素晴らしい答えであり、私は考慮していませんでした。つまり、IOExceptionが発生した場合、スローする前にGenericException1)Processesサブシステムにプロセスのリストを要求できます(そして、ここで完全なコード例を提供することはできません)。2)各プロセスに、使用しているデータベースを尋ねます。3)プロセスを、上書きしようとしているデータベースに割り当てられたデータベースと一致させ、4)DatabaseInUse(dbName, processName, applicationName例外をスローします。:)
ムージュース

1
確かに可能です。ただし、DBをプロセスに(特にネットワーク経由で)一致させるコードは複雑である/遅い/エラーが発生する可能性があり、追加のフラストレーションが発生する可能性があります(「ローカル(*#%^! %file !!!!ネットワーク共有にアクセスできないことに注意する理由!??!?! ")
-GWLlosa

1
@ Moo-Juice:あなたが提案するものは非常に素朴に聞こえます。データベースのような大規模なマルチスレッド環境では、グローバルサービスに手を差し伸べて「すべてのxyz」のリストを取得することはできません。別のスレッドで他のサービスと通信する場合でも、システム全体のデッドロックにつながる可能性のあるロックが必要です。他のデータが破損したり、少なくとも追加のエラーが発生する可能性があります。 ....
イクショー

1
その例は確かに非常に有益です。通常、このようなcatchハンドラーでは、tryブロックのどの部分が失敗したか確認することさえできません(通常、IOExceptionを引き起こす可能性のある複数の部分があります)。それに加えて、どのファイルがこのファイルに対応するのか分からないように、その場所ではファイルの名前を分からない可能性が非常に高いです。
イクショー

@Ichthyo、攻撃はありませんが、私はそれがまったく素朴だとは思わない。どのプロセスがまだデータベースへのハンドルを持っているかを知るために、データベースエンジンにシステムをロックするように依頼しているのではありません。企業全体を停止させることを求めているのではありません。簡単な答えを出す必要がある場合、そもそもデータベースサーバーの基本的な設計上の欠陥を示しています。覚えておいて、それは可能な限り最速の方法で関連情報を返すように設計されていることになっています。「誰?」という質問をするために 本当にあなたが言うほど素朴であってはなりません:)
Moo-Juice

2

私のお気に入りは(70年代後半に)ユニバックFortran IVコンパイラでした。

意味のないデータの解釈が試みられました


+1、絶対に素晴らしい!フィジーでは、あきらめて鶏を飼いに行きたいと思うのは、一種のエラーです。
ムージュース

実際、このエラーメッセージは100%正確です-より多くのconetxtを含むよりわかりやすいメッセージが必要な場合は、推測とヒューリスティックを組み込む必要があります。この方法により、誤解を招くようなエラーメッセージが表示される可能性が追加されます。
Ichthyo

0

エラーメッセージの大部分は、実際にはプログラマー(自己)向けの栄光に満ちたデバッグコード/ printfステートメントであると思います。

ユーザー指向のエラーメッセージを作成するということは、ユーザーが誰であるかを知り、知りたいことを予測することを意味します。開発者は、コードを記述している最中に、現在書いているコードをデバッグするため、または既知または主なユースケースに役立つ、自分自身に役立つエラーメッセージを書く傾向があります。

コードの記述からユーザーインターフェイス(またはユーザーエクスペリエンス)のテキスト部分の設計への切り替えは、コンテキストスイッチです。多言語アプリケーションなどの大規模アプリケーションでは、開発者が完全に処理するのではなく、別の人またはチーム(UI、翻訳)に引き継がれる可能性があるため、開発者がメッセージのコンテキストを慎重に説明しない限り、重要な詳細は簡単に失われました。

もちろん、エラーと例外が処理される(つまり、キャッチされる)限り、エラー処理のチェックと検証は優先度が低いと見なされますが、それほど重視されません。エラー状態には多くの場合、否定的な意味合い(つまり、間違いや失敗)が関連付けられているため、開発者またはQAが評価するためのコードベースの精神的に不利な場所です。


0

その理由は、エラーの報告/処理が常に後から考えられるからだと思います。彼らが完全に考えた後ではない場合でも、彼らはほとんど全体的なデザインの二流の市民です。

最近のソフトウェアは通常、複数のレイヤーで構成されています。エラー報告ロジックをあまり考えずに急いで作成すると、有用なエラーメッセージを表示するために必要なすべての情報を収集することが困難になることがよくあります。

たとえば、エラーはバックエンドでキャッチされますが、包括的なエラーメッセージを作成するには上位層からの情報が必要です。最も良いエラーメッセージには、ほとんどすべての層からの情報が必要です(システムで発生したことの包括的なビューを提供するため)。理想的なエラーメッセージは、「OK、最初に文字列を受け取ってから、おかしなものを与えるパーサーを通過したので、見たいと思うかもしれません。とにかく、それはさらに下に渡されました...」

設計段階でエラー報告メカニズムが第一級市民でない場合、それを行うには不必要な結合が必要になることがよくあります。ほとんどの人は、見た目が良くないもの(「参照してください。私のプログラムがクラッシュしました。エラーメッセージは便利です!」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.