2012-03-09 7 views
2

私は自分のエラー報告に電子メールで完全なエラー報告を送信するプロジェクトがあります。私は例外をキャッチし、すべての情報をサポートする電子メールを送信する別のメソッドに渡しています。Exception.Dataを渡す方法

私はException.Dataオブジェクトに重要なカスタム値を追加しています。しかし、Dataオブジェクト全体を渡すために、私のメソッドでどのタイプを使用する必要があるのか​​理解できません。ここで

私のコードです:

catch (Exception exc) 
{ 
    exc.Data.Add("ID", id); 
    emailConnector.sendErrorEmail(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString() + "." + System.Reflection.MethodBase.GetCurrentMethod().Name.ToString(), exc.Message, exc.Data, exc.StackTrace); 
} 

私は私が持っているパラメータ宣言になるようsendErrorEmailメソッドにexc.Dataを渡している:

public void sendErrorEmail(string origin, string error_message, IDictionary<object, object> data, string stack) 
しかし、私は取得するように見えることはできませんException.Dataの型宣言が正しい。私は変数と構造を同じに保つことを好みます(新しい変数はありません)。私は現在、Catchブロック内でsendErrorEmailを呼び出す数十のメソッドを持っているためです。

このタイプを使用する必要がありますか、このExceptionを取得するための簡単な方法はありますか?それに含まれている関連情報とともに正しくデータが渡されましたか?あなたの問題はあなたがIDictionary<object, object>として、それを宣言しているのに対し、exc.Dataの種類がIDictionaryであるということであると思われhelp pageを見てみると

おかげ

+0

明確な用途がある場合は、独自の例外を作成します。 http://msdn.microsoft.com/en-us/library/ms229064.aspx – Lloyd

+1

あなたは単純に関数に関数を渡してexc.dataにアクセスしてみませんか? – GianT971

+0

@ GianT971私は数十のメソッドを持っているので、Catchブロックを完全に再構成する必要があります。私は、exc.Dataを渡すことができ、その値をSendErrorEmailの中で取り出すことができるように、最小限の変更だけを行いたいと思っています。 – Encryption

答えて

1

あなたはあなたにこの方法は、私はにコメントで提案して行くだろう例外以外のもののために使用されていない限り、それはトラブルも

...の間の変換を持っていたというのタイプを伝えるエラーメッセージを持っている必要があります複数のプロパティを通過するのではなく、すべての例外を通過させてから切断します。

+0

このタイプのthinkikngもありました – GianT971

+0

Ahhh silly me。私は今問題を見る。 SendErrorEmailにIDパラメータを宣言する必要がありました - IDictionary <オブジェクト、オブジェクト>データの代わりにIDictionaryデータ – Encryption

0

Exception.DataのタイプはListDictionaryInternalです。これはプライベートフレームワーククラスなので、直接使用することはできませんが、次のパブリックインターフェイスを実装しています。

[0]: {Name = "IDictionary" FullName = "System.Collections.IDictionary"} 
[1]: {Name = "ICollection" FullName = "System.Collections.ICollection"} 
[2]: {Name = "IEnumerable" FullName = "System.Collections.IEnumerable"} 
+0

ドキュメントが何を宣言しているかが重要だと思います。この場合、それはIDictionaryとして宣言します。つまり、他の2つも実装する必要がありますが、内部オブジェクトの実装が悪いと考える場合は、パブリックインターフェイスのみを参照してください。 – Chris

+0

私が言うように、あなたはプライベートクラスを使用することはできません、その名前を探して悪い... FYI "パブリックインターフェイスIDictionary:ICollection、IEnumerable"ので、3のいずれかを使用してOKです... – Julien

+0

私のポイントは何かを見つけるために例外の実装を見てはいけないということです。あなたが名前を見つけたものをやっているならば、おそらく間違っているでしょう(それが好奇心のためでない限り)。 Exception.Dataプロパティを見て、それがIDictionaryであることを確認してください。 – Chris

関連する問題