我有一个快速的问题,希望有人之前已经完成过。在我目前正在处理的系统中,我们已经推出了自己的自定义提供程序来处理Web异常。我喜欢这个提供程序的一件事是它允许我们添加抛出异常的方法的参数值。代码看起来像这样。
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
答案 0 :(得分:4)
无法使用Reflection来检索方法参数值。只有调试器才能对其进行处理,但是在优化代码时,即使调试器也无能为力。 JIT编译器大大优化了参数传递。抑制此优化不值得花费相当大的成本,也无法自行调试。
只要您想保留此类型的异常报告,您就必须将参数值显式传递给某种格式化程序。一个辅助函数,它接受一个Params数组并返回一个异常对象,你可以将其跳转到脑海。
答案 1 :(得分:1)
反射不会给你参数值。这在Stack Overflow问题 Using reflection to get method name and parameters 和 Obtain parameter values from a stack frame in .NET? 中讨论。