#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) { … } код