Использование отражения для фиксации деталей ошибок


У меня есть быстрый вопрос, который, надеюсь, кто-то проработал раньше. В системе, над которой я сейчас работаю, мы запустили собственный пользовательский поставщик для обработки веб-исключений. Одна из вещей, которые мне нравятся в этом поставщике, заключается в том, что он позволяет нам добавлять значения параметров метода, который создает исключение. Код выглядит примерно так.

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
2 2

2 ответа:

Невозможно использовать отражение для извлечения значений аргументов метода. Только отладчик может иметь шанс на это, но даже отладчик бессилен, когда код оптимизирован. Передача аргументов сильно оптимизирована JIT-компилятором. Подавление этой оптимизации не стоит значительных затрат, и приложение не может отлаживать само себя.

Пока вы хотите сохранить этот стиль отчетов об исключениях, вам придется явно передавать значения аргументов в какой-то форматер. Помощник функция, которая принимает массив Params и возвращает объект исключения, который вы можете бросить, переходит на ум.

Отражение не даст вам значения параметров. Это обсуждается в вопросах переполнения стекаИспользование отражения для получения имени метода и параметров и еще получение значений параметров из фрейма стека в .NET?.