Расширить функциональность Try Catch C # - PullRequest
2 голосов
/ 24 октября 2011

У меня есть приложение MVC, где я использую блоки Try-Catch повсюду, и я ищу простой способ реализации регистрации действий / ошибок на основе глобального логического поля. Кто-нибудь знает, как я могу «расширить» функциональность кода Try-Catch, чтобы добавить свою собственную активность / журнал ошибок без необходимости проходить и касаться каждого блока?

Например:

Я бы хотел, чтобы попытка автоматически регистрировала в моей БД определенные элементы, такие как URL, действие, идентификаторы, параметры, информация об IP и т. Д., ... И Catch для автоматического входа его исключения в другую таблицу в БД.

Мысли? Рекомендации?

Спасибо, Питер

Ответы [ 5 ]

4 голосов
/ 24 октября 2011

Создайте свой собственный фильтр действий и украсьте им контроллеры или методы действий.

http://msdn.microsoft.com/en-us/library/dd381609.aspx

public class LoggingFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +
            filterContext.ActionDescriptor.ActionName);

        base.OnActionExecuting(filterContext);
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Exception != null)
            filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");

        base.OnActionExecuted(filterContext);
    }
}

Тогда используйте его

public class HomeController : Controller
{
    [LoggingFilter]
    public ActionResult Index() 
    {//...}
}
1 голос
/ 24 октября 2011

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

Мне нравится думать об этом, думая о Принципе единой ответственности . Такие вещи, как обработка ошибок, должны обрабатываться (по большей части) где-то еще, кроме класса, в котором эта ошибка обнаружена.

0 голосов
/ 24 октября 2011

Я бы не рекомендовал использовать это, но в Microsoft Enterprise Library есть «блок» (то есть модуль), который помогает управлять исключениями на разных уровнях. Вы можете взглянуть на то, что они делают для идей, или даже использовать это, если похоже, что это будет соответствовать вашим потребностям:

http://msdn.microsoft.com/en-us/library/ff664698(v=PandP.50).aspx

0 голосов
/ 24 октября 2011

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

0 голосов
/ 24 октября 2011

Я не знаю способа расширить существующий блок try / catch. Однако вы можете реализовать глобальный обработчик событий в Global.asax для всех необработанных исключений.

void Application_Error(object sender, EventArgs e) 
{
    // Code that runs when an unhandled error occurs
}

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

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

...