Я ищу простое решение для ведения журнала исключений в сочетании с обработкой ошибок в моем приложении ASP.Net MVC 1.0.ASP.Net MVC Exception Logging в сочетании с обработкой ошибок
Я читал много статей, включая вопросы, размещенные здесь в StackOverflow, которые предоставляют различные решения для разных ситуаций. Я все еще не могу найти решение, соответствующее моим потребностям.
Вот мои требования:
Чтобы иметь возможность использовать атрибут [HandleError] (или что-то эквивалент) на мой контроллер, чтобы обрабатывать все исключения, которые могут быть отброшены от любого из действий или Просмотров , Это должно обрабатывать все исключения, которые не были обработаны специально для любого из действий (как описано в пункте 2). Я хотел бы иметь возможность указать, какой вид пользователя должен быть перенаправлен пользователю в случаях ошибок, для всех действий в контроллере.
Я хочу, чтобы указать атрибут [HandleError] (или что-то подобное) в верхней части конкретных действий, чтобы уловить определенные исключения и перенаправить пользователей в представление, соответствующее исключению. Все остальные исключения по-прежнему должны обрабатываться атрибутом [HandleError] на контроллере.
В обоих случаях выше, я хочу, чтобы исключения регистрировались с использованием log4net (или любой другой библиотеки журналов).
Как я могу достичь вышеуказанного? Я читал о том, что все мои контроллеры наследуются от базового контроллера, который переопределяет метод OnException и в котором я выполняю регистрацию. Однако это будет беспорядочно с перенаправлением пользователей на соответствующие виды или сделать его грязным.
Я читал о написании своего собственного действия фильтра, которое реализует IExceptionFilter для обработки этого, но это будет противоречить атрибуту [HandleError].
До сих пор я считаю, что лучшим решением является написать мой собственный атрибут, который наследуется от HandleErrorAttribute. Таким образом, я получаю все функциональные возможности [HandleError] и могу добавить свой собственный журнал log4net. Решение таково:
public class HandleErrorsAttribute: HandleErrorAttribute {
private log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public override void OnException(ExceptionContext filterContext)
{
if (filterContext.Exception != null)
{
log.Error("Error in Controller", filterContext.Exception);
}
base.OnException(filterContext);
}
}
Будет ли приведенный выше код работать для моих требований? Если нет, какое решение удовлетворяет моим требованиям?
Ницца, спасибо большое, я буду использовать это. – Kezzer
Я подозреваю, что этот код имеет ошибку, в которой он принимает значение null, не возвращается для RouteData.Values ["action"] - вызов .ToString() может привести к тому, что ваш обработчик ошибок выкинет исключение NullReferenceException. Нет ничего более неприятного, чем обработчик ошибок, бросающий ошибку. –