2010-12-14 4 views
2

J'ai une petite question que j'espère avoir déjà posée. Dans le système sur lequel je travaille actuellement, nous avons déployé notre propre fournisseur pour gérer les exceptions Web. Une des choses que j'aime à propos de ce fournisseur est qu'il nous permet d'ajouter des valeurs de paramètres de la méthode qui lève l'exception. Le code ressemble à ceci.Utiliser la réflexion pour capturer les détails de l'erreur

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 

Dans le cas de cette méthode, la capture des paramètres et leurs valeurs est très manuel et sujettes à l'erreur que de plus en plus de gens touchent la base de code et d'oublier de mettre à jour l'erreur lancée. Existe-t-il un moyen d'aborder ce problème de manière plus automatisée/moins sujette aux erreurs?

J'ai joué avec la réflexion, mais je ne pense pas que vous puissiez déterminer les valeurs des paramètres par réflexion. Je voudrais quelque chose comme:

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 

Répondre

4

Il n'est pas possible d'utiliser Reflection pour récupérer des valeurs d'argument de méthode. Seul un débogueur peut avoir une chance, mais même un débogueur est impuissant lorsque le code est optimisé. Le passage d'argument est fortement optimisé par le compilateur JIT. La suppression de cette optimisation ne vaut pas le coût considérable, et une application ne peut pas déboguer elle-même.

Tant que vous souhaitez conserver ce style de rapport d'exception, vous devez passer explicitement les valeurs d'argument à un type de formateur. Une fonction d'aide qui prend un tableau de Params et renvoie un objet d'exception que vous pouvez jeter saute à l'esprit.

+2

J'ai déjà fait ce genre de chose auparavant. l'idée de ParamArray est géniale. Vous pouvez également faire quelque chose comme RaiseNewException (Ex, "Arg1", ValueofArg1, "Arg2", ValueofArg2), etc alors juste courir à travers le paramarray en utilisant les éléments 0,2,4 etc pour les noms de paramètres, et 1,3,5 etc. pour les valeurs. C'est toujours un mal de tête, mais c'est un peu mieux. Alternativement, un tisserand de code comme PostSharp peut faire ce genre de chose. – DarinH

Questions connexes