Я бы предложил реализовать пользовательский фильтр действий HandleErrorAttribute.
См. Эту ссылку для более подробной информации:
http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx
Настройка фильтра действий HandleErrorAttribute дает вам полный контроль над тем, какие действия обрабатываются фильтром, и его легко установить на уровне контроллера или даже на уровне сайта, настроив его на настраиваемом базовом контроллере и имея все ваши контроллеры наследуются от базового контроллера.
Что-то еще, что я делаю с этим, у меня есть отдельный HandleJsonErrorAttribute, который отвечает на вызовы Ajax, возвращая ответ Json, а не пользовательскую страницу.
UPDATE:
По некоторым вопросам ниже приведен пример HandleJsonErrorAttribute
, который я использую:
public class HandleJsonErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
var serviceException = filterContext.Exception as ServiceException;
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };
filterContext.ExceptionHandled = true;
}
}
А вот jQuery, который я использую для обработки этих необработанных исключений:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
showPopdown($.parseJSON(jqXHR.responseText).message);
});
Это позволяет моим Ajax-методам быть очень легковесными - они просто обрабатывают возвращаемый нормальный Json, а в случае незапланированного исключения сообщение с кодом состояния ошибки переносится в Json и возвращается.
Кроме того, в моей реализации у меня есть пользовательский ServiceException
, который я выбрасываю из сервисов, и это отправляет сообщение с сервисного уровня вместо общего сообщения.