Советы по обработке ошибок с использованием отражения и запутывания - PullRequest
0 голосов
/ 04 мая 2011

Я использую стандартную процедуру обработки ошибок в моих методах, которая выглядит следующим образом:

Try
    Cursor.Current = Cursors.WaitCursor



    Cursor.Current = Cursors.Default
Catch ex As Exception
    MyAssembly.SystemError(MethodBase.GetCurrentMethod().Name, ex.Message, MsgBoxStyle.Exclamation)
End Try

Функция MyAssembly.SystemError записывает ошибку в файл и отображает окно сообщения.

Это прекрасно работает, пока я не запустил свой код через запутывание, потому что он переименовывает имя метода в некоторые неразборчивые символы (как и должно быть), поэтому отраженное имя метода, возвращаемое MethodBase.GetCurrentMethod().Name, также непонятно.

Я начал заменять MethodBase.GetCurrentMethod().Name на имя метода, но затем, если я переименую метод, я могу (и могу) забыть изменить имя обработки ошибок.

Есть ли у кого-нибудь хорошие идеи для работы со всем этим?

1 Ответ

0 голосов
/ 04 мая 2011

Это, к сожалению, одна из ловушек запутывания, без реального обходного пути (весь смысл запутывания заключается в том, чтобы скрыть и запутать ту информацию, которую вы пытаетесь показать здесь).

С точки зрения удобства использованияВ любом случае вы должны создавать сообщения об ошибках из значимых, где это возможно, таких как «Файл {0} не найден».Если вы запутываете свой код, то определенно не сможете полагаться на имена методов (или другую отраженную информацию) для создания своих сообщений об ошибках.

Кстати, встраивание имени метода в виде строки в ваш метод таким образом, по сути, отменяетвсе равно работа обфускатора.Я бы посоветовал:

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

Наконец, обработка ошибок, которую вы делаете, должна, вероятно, в любом случае выполняться в событии ThreadException , но это уже совсем другая тема!: -)

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