Использование отражения для захвата деталей об ошибках - PullRequest
2 голосов
/ 14 декабря 2010

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

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 ]

4 голосов
/ 14 декабря 2010

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

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

1 голос
/ 14 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...