Переопределить `HandleErrorAttribute` в ASP.NET MVC - PullRequest
2 голосов
/ 08 июля 2011

Я хочу переопределить HandleErrorAttribute новой версией, которая называется что-то вроде HandleErrorsWithLogging. По сути, я хочу, чтобы оно регистрировало необработанное исключение в моем файле журнала, а затем продолжало работать с типичной функцией Redirect to ~ / Shared / Error , которую вы получаете с HandleError.

Я уже добавляю HandleError ко всем своим действиям в global.asax

Это лучший подход или есть какой-то более простой способ получить доступ к этому необработанному исключению для целей регистрации? Я также думал о вызове Ajax в самом представлении Error.

Ответы [ 2 ]

6 голосов
/ 13 апреля 2013

Вы можете создать собственный фильтр, который наследуется от FilterAttribute и реализует IExceptionFilter. Затем зарегистрируйте его в global.asax.cs. Также вы должны включить пользовательскую обработку ошибок в web.config:

<customErrors mode="On"/>  


    public class HandleErrorAndLogExceptionAttribute : FilterAttribute, IExceptionFilter
        {
            /// <summary>
            /// The method called when an exception happens
            /// </summary>
            /// <param name="filterContext">The exception context</param>
            public void OnException(ExceptionContext filterContext)
            {
                if (filterContext != null && filterContext.HttpContext != null)
                {
                    if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
                    {
                        // Log and email the exception. This is using Log4net as logging tool
                        Logger.LogError("There was an error", filterContext.Exception);

                        string controllerName = (string)filterContext.RouteData.Values["controller"];
                        string actionName = (string)filterContext.RouteData.Values["action"];
                        HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);

                        // Set the error view to be shown
                        ViewResult result = new ViewResult
                        {
                            ViewName = "Error",
                            ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                            TempData = filterContext.Controller.TempData
                        };

                        result.ViewData["Description"] = filterContext.Controller.ViewBag.Description;
                        filterContext.Result = result;
                        filterContext.ExceptionHandled = true;
                        filterContext.HttpContext.Response.Clear();
                        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
                    }
                }
            }
1 голос
/ 08 июля 2011

Переопределение атрибута HandleError действительно является одним из подходов к обработке этого. Есть и другие подходы. Другой подход - использовать ELMAH , который позаботится об этом, чтобы не беспокоиться о регистрации. Еще один подход состоит в удалении любых HandleError глобальных фильтров из Global.asax и подписке на Application_Error, который является более общим, чем HandleError, поскольку он будет перехватывать также исключения, которые происходят вне конвейера MVC. Вот пример такой обработки.

...