В веб-приложении MVC3 я использовал
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
применить глобальную обработку ошибок, когда пользователю было показано представление "Ошибка", если произошло необработанное исключение.
Для одного конкретного представления я также хотел, чтобы отображалось другое представление ошибки, если возникло необработанное исключение, украсив метод с помощью [HandleError(View = "SpecialError")]
. Это отлично работает.
Затем я хотел добавить глобальный журнал необработанных исключений. Я создал собственный атрибут HandleError с кодом регистрации:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
И обновленные RegGlobalFilters и украшение метода, чтобы использовать это имя атрибута вместо. Это работает вообще, но когда исключение возникает в методе, украшенном MyHandleError(View = "SpecialError")]
, метод OnException вызывается дважды. Первоначально предполагалось, что декорирование метода с помощью этого атрибута заменяет глобальный обработчик, но кажется, что оно просто добавляется (что имеет больше смысла, но это не то, что я хочу). Вызывая OnException дважды, одно и то же исключение записывается дважды, что не должно происходить. Я не думаю, что OnException вызывается дважды, потому что это настраиваемый атрибут. Я считаю, что это происходит и со стандартным атрибутом HandleError, но теперь это просто видно, поскольку я создаю его запись.
В конечном счете, я хочу регистрировать все необработанные исключения (один раз), сохраняя функции, предлагаемые [HandleError], в частности, устанавливая разные представления для определенных исключений метода. Есть ли чистый способ сделать это?