C#でエンタープライズプロジェクトのエラーコードパターンを作成するためのベストプラクティス[非公開]


43

私は多くのSMBや企業に展開されるエンタープライズプロジェクトに取り組んでいます。
このプロジェクトのサポートは苦労するため、エラーのコーディングパターン(HTTPステータスコードなど)を作成したいと思います。これにより、ヘルプデスクの担当者がドキュメントを参照し、できるだけ早く問題をトラブルシューティングできます。

これを行うためのベストプラクティスと推奨事項は何ですか?
これを行うためのヘルプは役に立ちます。


1
考えられる答えが多すぎるか、この形式では良い答えが長すぎます。詳細を追加して回答セットを絞り込むか、いくつかの段落で回答できる問題を特定してください。そして、今までに何を試しましたか。
ベンマクドゥーガル

ビジネスの構造に依存します。C#では、常にユーザーにStackTraceをメールで送信したり、エラーメッセージの詳細からコピー/貼り付けしたりすることができます(厳密なセキュリティ要件はありませんでした)。
ファルコン

回答:


69

エラーコードとエラー戻り値には違いがあります。エラーコードは、ユーザーとヘルプデスク用です。エラー戻り値は、コードでエラーが発生したことを示すコーディング手法です。

エラー戻り値を使用してエラーコードを実装することもできますが、それに対してアドバイスします。例外はエラーを報告する最新の方法であり、エラーコードを例外に含めない理由はありません。

これは私がどのように整理するかです(ポイント2-6は言語に依存しないことに注意してください):

  1. 追加のErrorCodeプロパティを持つカスタム例外タイプを使用します。メインループのキャッチは、通常の方法でこのフィールドを報告します(ログファイル/エラーポップアップ/エラー応答)。すべてのコードで同じ例外タイプを使用します。
  2. 1から始めたり、先行ゼロを使用したりしないでください。すべてのエラーコードを同じ長さに保つので、間違ったエラーコードを見つけやすくなります。通常、1000から開始するだけで十分です。主要な「E」を追加して、ユーザーが明確に識別できるようにします(特に、サポートデスクがユーザーにエラーコードを見つける方法を指示する必要がある場合に役立ちます)。
  3. すべてのエラーコードのリストを保持しますが、コードではこれを行わないでください。開発者向けのWikiページに短いリストを用意しておき、新しいコードが必要なときに簡単に編集できるようにします。ヘルプデスクには、独自のウィキに個別のリストが必要です。
  4. エラーコードに構造を強制しようとしないでください。分類するのが難しいエラーは常に存在するため、エラーが45xxグループと54xxグループのどちらにあるべきかを何時間も議論したくはありません。実用的である
  5. コード内の各スローに個別のコードを割り当てます。同じ原因だと思っていても、ヘルプデスクはさまざまなケースでさまざまなことをする必要があります。Wikiに「E1234:See E1235」を含める方が、ユーザーに間違ったことを告白させるよりも簡単です。
  6. ヘルプデスクが要求した場合、エラーコードを分割します。if (...) throw new FooException(1234, ".."); else throw new FooException(1235, "..");コード内の簡単な行により、ヘルプデスクの時間を30分節約できます。

そして、エラーコードの目的がヘルプデスクの生活を楽することであることを決して忘れないでください。


これを個人的に行ったことはありませんが、多くの場合、ユーザーに表示され、ログに記録されるエラーインスタンス固有のGUIDも「相関ID」として表示されます。これにより、おおよその時間とエラーコードを使用するよりも簡単に、ログで正確なエラーの発生を簡単に見つけることができます。
xdhmoore

ヘルプデスクの人間が読めるエラーコードとして、また開発者のエラーインスタンスIDとして機能できるように、おそらく相関ID内にエラーコードを含める方法があると思います。
xdhmoore

私のパターンはかなり似ています。しかし、「E」の代わりに、app-partの短い部分を追加しました。ドキュメンテーションフレームワークには、たとえばDoc1234しばらくの間、メインアプリにを含めることができますIrS1234。したがって、私のヘルプデスクの同僚は、ユーザーの支援を非常に迅速に行っています。
マティアスバーガー

6

最初に、エラーが発生する可能性があり、ユーザーに見える領域を分離する必要があります。その後、それらを文書化できます。そのシンプル。

理論的には単純です。実際には、エラーはすべての場所で発生する可能性があり、エラーを報告することで、素晴らしいコードをロギング、例外のスローと処理、戻り値の受け渡しのモンスターに変えることができます。

その場合、2段階のアプローチをお勧めします。まず、ログを記録し、ロットとロットを記録します。

2つ目は、主要なコンポーネントとそのインターフェイスを決定し、これらのコンポーネントが検出できる主要なエラーケースを定義することです。これらのエラーの1つ(エラーの内部処理方法はユーザー次第)で、よりわかりやすい方法でログインできます-例外またはエラーコードはここでは違いはありません)。ユーザーは通常、エラーを確認し、ログを参照して詳細情報を確認します。

同じアプローチがWebサーバーとhttpエラーコードの例に使用されます。ユーザーが404を確認し、サポートに報告すると、ログで何が起こっているのか、どのページにアクセスしたのか、いつ閲覧したのかなど、詳細な情報を収集します、DB、ネットワーク、またはアプリケーション内にあります。


3

説明的な名前と明確なメッセージを含むカスタム例外に行き、それらをスローします。エラーコードを渡したり解釈したりするためのサポートを組み込むよりも、言語の既存の例外インフラストラクチャを使用する方がはるかに簡単です。


1
私は理由を与える少なくともに1から0にこの答えをdownvoted人...感謝
ステファンBilliet

1
私はダウンボーティングではありませんでした(それは重要ではありませんが、それを乗り越えてください)が、言語の戻り値にも既存のサポートがあると思います。
gbjbaanb

2
それは私にとって重要です。私が間違っている場合、私は学ぶことができるように知りたいです:-pどういう意味ですか、既存の戻り値のサポート?通常の戻り値とエラーコードを区別するために配管を記述する必要はありませんか?システムの境界で例外をエラーコードに変換することは1つのことですが、システム内で例外をジャグリングすることは、一般的には推奨されないことです。Pragmatic Programmerがこの種のことを言及していると思います。
ステファンビリエット

1
例外はすべての場合に適したメカニズムではありませんが、エラーを使用することに決めた場合は、すべての呼び出しにoutパラメーターを追加するか、重要な呼び出しがすべてコードを返すようにすることができます。それをするために前もって決めてください、そしてあなたは黄金です。実用的には、境界でエラーコードを返す(したがって、単一の言語にロックされない)と例外を内部で使用するという2つの組み合わせになります。
gbjbaanb

6
私はあなたに賛成票を投じませんでした(簡単に考えてください、そうでなければ誰もがこれを繰り返す必要があります:)。サービスデスクで働いたり電話をかけたりした場合、エラーメッセージよりも短い番号を伝える方がはるかに簡単です。エラーメッセージは、口頭で伝えられたときに変更されることが保証されています。
コーディズム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.