2016-08-30 4 views
0

У меня есть различные фильтры, прежде чем URL-адрес попадет в действие контроллера.Как обрабатывать исключение, возникающее в фильтре?

Очень мало фильтров имеет сложную логику, которая может генерировать исключения.

Теперь, как я могу поймать эти исключения?

Для примера. У меня есть фильтр, который обрабатывает исключение, происходящее в методе контроллера.

[ActionFilter1] - это фильтр, который обрабатывает любые исключения, возникающие в методе контроллера.

public override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 

//exception occuring here 

} 

Один из способов сделать что-то вроде этого:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
    try { 
    //exception occuring here 
    } 
    catch { 
    //log here 
    } 
    } 

, так как есть n фильтров, я не хочу повторять эту логику добавления try & catch к каждому фильтру.

В этом случае, как я могу продолжить обработку ошибок в одном месте, которая может обрабатывать любые исключения, возникающие во всех этих фильтрах?

+0

это может быть полезно: https://www.simple-talk.com/dotnet/asp-net/handling-errors-effectively-in-asp-net-mvc/ – Ziyad

+1

Если вы не поймать это в фильтре, я думаю, что следующая остановка находится на уровне global/app. Проблема с исключениями фильтров заключается в том, что, если вы не едите его, вы не можете отображать представление, потому что действие действительно недействительно и не может быть вызвано снова, не вступая в цикл. –

ответ

2

Прочтите эту статью. Вы найдете ответ http://www.codeproject.com/Articles/850062/Exception-handling-in-ASP-NET-MVC-methods-explaine

+0

Собственно, в статье обсуждается обработка исключений между контроллерами. Я ищу что-то, что может обрабатывать исключения во всех контроллерах, методах действий, фильтрах и глобальном ... –

+0

над классом атрибута вам нужно написать это: [AttributeUsage (AttributeTargets.Method | AttributeTargets.Class)], чтобы он мог быть применительно к действиям, а также контроллерам – divya

+0

Да, это будет ловить исключения только из '1actions' и' controllers'. что, если исключение происходит из 'filter' или вне действий и контроллеров? –

1

Добавление Дивья в ответ/комментарии, вот моя находка:

Фрагмент кода:

[Filter1, Filter2, MyErrorFilter] 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      //throw new Exception("Poda!"); 
      return View(); 
     } 

     public ActionResult About() 
     { 
      ViewBag.Message = "Your application description page."; 

      return View(); 
     } 

     public ActionResult Contact() 
     { 
      ViewBag.Message = "Your contact page."; 

      return View(); 
     } 
    } 

    public class Filter1 : ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      Console.WriteLine("filter1-action executing!!"); 
      base.OnActionExecuting(filterContext); 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      Console.WriteLine("filter1-action executed!!!"); 
      base.OnActionExecuted(filterContext); 
     } 
    } 

    public class Filter2: ActionFilterAttribute 
    { 
     public override void OnActionExecuting(ActionExecutingContext filterContext) 
     { 
      Console.WriteLine("filter2-action executing!!!"); 
      throw new Exception("poda!!1"); 
      base.OnActionExecuting(filterContext); 
     } 

     public override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      Console.WriteLine("filter2-action executed!!!"); 
      base.OnActionExecuted(filterContext); 
     } 
    } 

    public class MyErrorFilter : HandleErrorAttribute 
    { 
     public override void OnException(ExceptionContext filterContext) 
     { 
      Console.WriteLine("an exception captured!!!"); 
      base.OnException(filterContext); 
     } 
    } 

Теперь исключение встречающийся в Filter2, который в настоящее время захвачен HandleErrorAttribute (Этот фильтр имеет порядок -1, btw)

Итак, даже если у вас есть фильтры n, если какое-либо из этих исключений произошло, то это captu красный на HandleErrorAttribute уровне :)

Примечание [2017 ноябрь]: Вы можете зарегистрировать MyErrorFilter на глобальном уровне, так вам не нужно украсить его сверху каждого контроллера у вас есть.

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new MyErrorFilter()); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^