2008-09-07 13 views
11

非常に具体的な問題が発生する可能性があるため、カスタム例外を作成しました。私は別のシステムからデータを受け取り、そのデータを解析しようとしている間に爆弾が出たら例外を発生させます。私のカスタム例外では、 "ResponseData"というフィールドを追加しました。そのため、コードが処理できなかったものを正確に追跡できます。カスタム例外に特別な情報を追加する

このようなカスタム例外では、余分な応答データは例外 "メッセージ"に入るはずですか?それがそこに行けば、メッセージは巨大になる可能性があります。私はElmahを使用しているので、そこに欲しいと思っています。それが私がそのデータを入手する方法です。

そこで質問はどちらかである: - どのように私はELMAHは、カスタム例外 OR のフィールドから追加情報を記録するために取得することができます - 追加の例外の詳細は、「メッセージ」プロパティに行くべきでしょうか?

答えて

6

.Messageにデバッグ情報を入力するのではなく、簡潔で便利なテキストを入力してください。

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

メッセージのテキストが完全にエラーを記述しなければならないと、可能な場合は、それを修正する方法を説明しなければなりません。 Messageプロパティの値は、ToStringによって返される情報に含まれます。

メッセージプロパティは、例外を作成する場合にのみ設定されます。現行インスタンスのコンストラクターにメッセージが提供されなかった場合、システムは現在のシステムカルチャを使用してフォーマットされたデフォルトのメッセージを提供します。

[..]継承時の

メッセージプロパティは、メッセージの内容または形式の制御を必要とするクラスでオーバーライドされます。キャッチされた例外に関する情報を表示する必要がある場合、アプリケーションコードは通常このプロパティにアクセスします。

エラーメッセージはローカライズする必要があります。

レスポンスデータは説明の対象外です。

elmahに詳しくないので、使用中にExceptionクラスを拡張する方法を教えてください。 elmahは独自のサブクラスをExceptionに実装していますか?またはインターフェイスですか?それを自分でサブクラス化できますか?

0

私は、あなたがSystem.Exceptionを拡張しており、既にElmahフィールドを追加しているという疑問が分かりません。それはそれが所属するところです - 例外自体の公共財産として。

1

私はこの質問を完全に理解していませんが、追加の例外データをどうすればよいか質問しているようです。

私は質問する重要な質問は、まさに例外メッセージですか?例外がどこから来たのかを知るためのものではなく、スタックトレースはそのためのものです。もっと一般的な例外をカプセル化するのではなく、InnerExceptionフィールドを使って行う必要があります。あなたの例外がコードの特定の場所からだけ発生した場合、それはあなたが持っていたエラーの種類を記述することさえありません。例外のタイプが何であるかです。

一般的に私はメッセージフィールドを使用して、人間ではない簡単なヒントを提供します。私のものではないプログラマが、このエラーを最初に見て、基礎となるシステムの理解を得ることができます。私は、短い(1つの文)説明、このエラーが頻繁にどのように発生するかについてのヒント、またはさらなる読書への言及について、メッセージフィールドが適切であると考える。

あなたの質問を理解する限り、別のシステムから受け取ったこの「追加情報」を保存する最善の方法は、InnerExceptionと考えることができます。私はエルマを知らないが、塩の価値があるならば、それはInnerExceptionsをチェックして保存するだろう。

0

Elmahは、未処理の例外を記録するHTTPモジュールです。

私はそれがカスタムフィールドを格納しないので、Elmahの単なる制限だと思います。私はそれらの人に尋ねなければならないと思う。私は応答データのためにそこに余分なフィールドを持っていますが、Elmahはそれを保存しません。カスタム例外で

11

など、この一つとして、 は、余分な応答データは、例外「メッセージ」に を行くべき?

いいえ、Sören already pointed outとして。ただし、例外タイプはToStringをオーバーライドし、そこに応答データ情報を追加することができます。これは、BCL(基本クラスライブラリ)の例外タイプの多くに続く、完全に正常な習慣であり、あなた自身が潮を泳いで泳いでいることはありません。例えば、SSCLI (Rotor)System.IO.FileNotFoundException.ToString実装を見て:あなたが見ることができるように

public override String ToString() 
{ 
    String s = GetType().FullName + ": " + Message; 

    if (_fileName != null && _fileName.Length != 0) 
     s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName); 

    if (InnerException != null) 
     s = s + " ---> " + InnerException.ToString(); 

    if (StackTrace != null) 
     s += Environment.NewLine + StackTrace; 

    try 
    { 
     if(FusionLog!=null) 
     { 
      if (s==null) 
       s=" "; 
      s+=Environment.NewLine; 
      s+=Environment.NewLine; 
      s+="Fusion log follows: "; 
      s+=Environment.NewLine; 
      s+=FusionLog; 
     } 
    } 
    catch(SecurityException) 
    { 

    } 
    return s; 
} 

、それはアセンブリのロードに失敗した場合に余分情報を表す、FusionLogプロパティの内容を追加します。私はELMAHは、カスタム 例外でフィールドから

ELMAH店舗あなたが持っているので、もしエラーの詳細などは例外でToStringを呼び出した結果を余分 情報を記録するために取得できますか

ToStringが規定どおりに実装されていれば、情報は今後の作業なしにログに記録されます。唯一の問題は、ログに記録された詳細が構造化されていないことです。テキスト。

4

Exceptionクラスには、カスタムデータをバニラの例外に関連付けるために使用できる辞書(名前はData、私は考える)が含まれています。

+0

http://msdn.microsoft.com/en-us/library/system.exception.data(v=vs.110).aspx –

+0

例外がシリアル化されている場合は、その内部のすべてがシリアル化可能である必要があります。あなたのオブジェクトが複雑な場合に必要なものだけを抽出することができます –

関連する問題