2010-12-14 14 views
2

私は早急に質問します。私が現在取り組んでいるシステムでは、Web例外を処理する独自のカスタムプロバイダを用意しています。このプロバイダについて私が気に入っていることの1つは、例外をスローするメソッドのパラメータ値を追加できることです。コードは次のようになります。より多くの人々がコードベースをタッチしスローエラーを更新するのを忘れて、この方法の場合リフレクションを使用してエラーの詳細を取得する

Public Sub Dosomething(ByVal Parameter1 As String, ByVal Parameter2 As String) 
    Try 
     'Do some process that causes and error. 
    Catch ex As Exception 
     Dim ErrorDetails = New List(Of String) 

     ErrorDetails.Add("Parameter Values:") 
     ErrorDetails.Add(String.Format("Parameter 1: {0}", Parameter1)) 
     ErrorDetails.Add(String.Format("Parameter 2: {0}", Parameter2)) 

     RaiseNewCustomException(ex, ErrorDetails) 
    End Try 
End Sub 

は、パラメータとその値の取得は非常にマニュアルとエラーを起こしやすいです。より自動化された/エラーの少ない方法でこの問題にアプローチする方法はありますか?

私はリフレクションで遊んでいましたが、リフレクションでパラメータ値を確認できるとは思いません。

Public Sub Dosomething(ByVal Parameter1 As String, ByVal Parameter2 As String) 
    Try 
     'Do some process that causes and error. 
    Catch ex As Exception 
     RaiseNewCustomExceptionAndAutomaticallyGenerateParameterErrorString(ex, System.Reflection.MethodInfo.GetCurrentMethod()) 
    End Try 
End Sub 

答えて

4

メソッドの引数値を取得するためにReflectionを使用することはできません。デバッガだけが発射できますが、コードが最適化されるとデバッガでさえも無力です。引数の受け渡しは、JITコンパイラによって大幅に最適化されます。この最適化を抑止することは相当なコストがかかりませんし、アプリケーション自体をデバッグすることもできません。

この種類の例外レポートを保持したい場合は、明示的に引数値をある種のフォーマッタに渡す必要があります。 Params配列をとり、投げることができる例外オブジェクトを返すヘルパ関数です。

+2

私はこれまでにこのようなことをしてきました。 ParamArrayのアイデアは素晴らしいです。また、RaiseNewException(例: "Arg1"、ValueofArg1、 "Arg2"、ValueofArg2)などのようにして、paramarrayの項目0,2,4などを使ってparamarrayを実行することもできます。値の場合それはまだmaintの頭痛ですが、それは少し良いです。代わりに、PostSharpのようなコードウィーバーがこの種のことをすることができます。 – DarinH

関連する問題