Пользовательская обработка ошибок и журнал

#c# #asp.net #syntax #error-handling #class-design

#c# #asp.net #синтаксис #обработка ошибок #дизайн класса

Вопрос:

Как вы знаете, основной метод обработки ошибки — try … catch … наконец, структура.

Если мы хотим обработать каждую ошибку и сохранить ее в файл, мы должны добавить одну строку в раздел catch для сохранения сведений об ошибке.

Вопрос в том, есть ли какое-либо решение для переопределения события catch?

Другими словами, рассмотрим попытку … поймать … наконец, структурируйте аналогично другим событиям приложения и переопределите раздел catch, запустите наш пользовательский код, затем запустите код раздела catch.

Возможно ли это?

Ответ №1:

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

На самом деле, вы хотите что-то, что должно:

  • Обработка исключений.
  • Регистрируйте исключения.

Существует концепция, называемая IL weaving, которая основана на внедрении кода после компиляции, что упрощает аспектно-ориентированное программирование.

То есть вы можете что-то делать до и после выполнения методов и свойств, и, в конце концов, это «обработка любого исключения, сгенерированного в любом элементе сборки», не так ли?

Например, у меня есть некоторый опыт работы с PostSharp, который реализует ткачество IL и невероятно упрощает работу с ним: он основан на атрибутах.

Вам нужно реализовать пользовательский атрибут, производный от некоторого базового атрибута PostSharp, и он может переопределять некоторый метод, который будет вызываться до, а другой — после выполнения метода / свойства, в котором вы размещаете свой атрибут.

Обработка исключений может быть реализована как «HandleExceptionAttribute» и ведение журнала «LogAttribute» (это просто пример!).

Узнайте больше о PostSharp на (если я не ошибаюсь, у него есть бесплатная версия для сообщества):

И некоторые «практические рекомендации»:

Комментарии:

1. Это замечательно. Я прочитал ваше решение и вижу эти ссылки. Но я действительно не понимал, что это может сделать! Может ли он обработать любую ошибку во всех классах проекта, даже если программист напишет свой раздел catch?

2. Вот и все! Вы можете это сделать 🙂

Ответ №2:

Вы можете перехватывать определенные типы исключений

 Try
{do something}
catch (SystemException ex) { }
catch (InvalidOperationException ex) { }
catch (Exception ex) { }
  

Это то, что вы имеете в виду?

В противном случае вы можете реализовать класс обработчика исключений

Комментарии:

1. Нет, моя дорогая. Спасибо за ваш ответ. Я хочу переопределить раздел catch, который возникает, даже если мы пишем catch (исключение ex) { … } код