4

理論的には、エンド ユーザーに内部エラーが表示されることはありません。しかし実際には、理論と実践は異なります。問題は、エンド ユーザーに何を表示するかです。ここで、まったく技術に詳しくないユーザーの場合は、表示される情報をできるだけ少なくしたいと考えていますが (「ここをクリックしてバグ レポートを送信する」など)、上級ユーザーの場合は回避策があるかどうかを知りたがります、それがしばらくの間知られている場合など。そのため、何が問題なのかについてのある種の情報も含めたいと考えています。

これを行う古典的な方法は、filename:line-number を使用した assert または同じスタック トレースのいずれかです。これは開発者にとって良いことです。ただし、ユーザーにとってはいくつかの重大な欠点があります。特に、非常に不可解であり (不親切など)、コードを変更するとエラー メッセージが変更されます (エラーのグーグル検索はこのバージョンでのみ機能します)。

これらの問題に対処したい場所で書くことを計画しているプログラムがあります。私が欲しいのは、アサートの周りのコードを編集しても変更されないように、すべてのアサートに一意の ID を付ける方法です。(たとえば、別のファイルにカット/ペーストした場合、同じ情報が表示されるようにしたい) 何かアイデアはありますか?

私が考えている 1 つの方法は、エラーを列挙することですが、それらが複数の場所で使用されないようにする方法は?

(注:この質問では、コーディングエラーによって引き起こされたエラーのみを見います。不正な入力のように合法的に発生する可能性があるものではありません。OTOHこれらのエラーは、コミュニティ全体にとって何らかの関心があるかもしれません。)

(注 2: 問題のプログラムは、ユーザーのシステムで実行されているコマンド ライン アプリです。ただし、これも私の状況です。)

(注 3: ターゲット言語はDであり、メタプログラミングに飛び込みたいと思っています。他の言語の回答は大歓迎です!)

(注 4: 実際のコードの場所ではなく、エラーに何らかの記号名を使用することを明示的に望んでいます。これは、コードが実質的に何らかの方法で変更されると、コードの場所が変更されるためです。)

4

3 に答える 3

2

興味深い質問です。私が何度か使用した解決策は次のとおりです: 致命的なエラーの場合 (たとえば、致命的でないエラーはユーザーに入力を修正する機会を与える必要があります)、多くの関連情報を含むファイルを生成します: リクエスト変数、ヘッダー、内部構成情報、および後でデバッグするための完全なバックトレース。これは、生成された一意のファイル名 (およびプレフィックスとしての時間) を持つファイルに保存されます。

ユーザーには、回復不能なエラーが発生したことを説明するページを提示し、バグを報告する場合は参照としてファイル名を含めるように依頼します。問題のあるリクエストのコンテキストから、このすべての情報を使用してデバッグする方がはるかに簡単です。

PHP では、これには debug_backtrace() 関数が非常に便利です。あなたのプラットフォームに相当するものがあると確信しています。

また、関連する http ヘッダーを送信することも忘れないでください: おそらく: HTTP/1.1 500 Internal Server Error

エラー レポート ファイルの適切な形式があれば、ユーザーが報告していないエラーを分析することもできます。

于 2008-11-25T19:53:30.067 に答える
1

これらのエラー コードの使用についてソース ツリー全体を grep するスクリプトを作成し、重複がある場合は文句を言います。そのスクリプトを単体テストの一部として実行します。

于 2008-11-25T19:54:44.213 に答える
1

私はあなたのターゲット言語について何も知りませんが、これは私が考えた興味深い質問であり、私の 2 セントを追加したかった.

ハードエラーと内部エラーのメッセージは、開発者が問題を特定して迅速に修正できるように、可能な限り有用であるべきだと常に感じています。ほとんどのユーザーはこのエラー メッセージを見ることさえありませんが、非常に洗練されたエンド ユーザー (おそらく技術サポート担当者) は、非常に詳細なエラー メッセージを見て、問題が何であるかをよく理解し、斬新な回避策を考え出すことさえあります。鍵となるのは、これらのエラー メッセージをわかりにくくすることなく詳細にすることです。これは、科学というより芸術です。

アウトプロセス COM サーバーを使用する Windows プログラムの例。メイン プログラムが COM サーバーからオブジェクトをインスタンス化しようとして失敗し、次のエラー メッセージが表示された場合:

「警告: UtilityObject をインスタンス化できません: 'CoCreateInstance' でエラー 'クラスが登録されていません'」

ユーザーの 99% がこれを見て、ギリシャ語で書かれていると思います。技術サポート担当者は、COM サーバーを再登録する必要があることにすぐに気付く場合があります。そして、開発者は何がうまくいかなかったのかを正確に知ることができます。

いくつかのコンテキスト情報をアサーションに関連付けるために、私の C++ コードでは、メソッドの名前を含む単純な文字列を使用するか、エラーが発生した場所を明確にする何かを使用することがよくありますについて尋ねないでください):

int someFunction()
{
  static const std::string loc = "someFunction";
  :  :
  if( somethingWentWrong )
  {
    WarningMessage(loc.c_str(), "Unable to Instantiate UtilityObject:  Error 'Class Not
    Registered' in 'CoCreateInstance);
  }
}

...生成するもの:

警告 [someFunction] : UtilityObject をインスタンス化できません: 'CoCreateInstance で「クラスが登録されていません」というエラーが発生しました

于 2008-11-26T05:32:12.237 に答える