Обработка исключений в контроллере в ASP.Net MVC 4 с ELMAH и ajax
Я видел несколько постов и статей, но не смог найти четкое решение.
Я установил Elmah.MVC через NuGet и прокомментировал эту строку из FilterConfig.cs:
//filters.Add(new HandleErrorAttribute());
Чтобы Элма уловил ошибки.
Это работает, когда я предоставляю неверное имя действия и получаю желтую страницу, а также электронное письмо.
Я хочу знать о двух других типах ошибок, которые может генерировать мой код... как мы должны их обрабатывать:
1. Например, если мой уровень хранилища или менеджера (бизнес-логика) выдает исключение при попытке получить доступ к базе данных или отправить электронное письмо и т. Д.
а. Является ли правильный способ НЕ реализовывать какие-либо попытки catch в контроллерах (или где-либо еще в этом отношении) и позволить Elmah позаботиться об исключениях?
б. Если так, и если он показывает желтую страницу с ошибкой, как мы можем показать представление по своему вкусу?
2.Если мое представление содержит вызовы ajax, например, через jqgrid, и за кулисами есть ошибки, я заметил, что они также правильно воспринимаются Elmah. Но как мне показать какое-то сообщение об ошибке пользователю?
Спасибо
3 ответа
Вот что я сделал:
В контроллере я разместил попробуй catch:
try
{
//model = getmodelfromdb();
return View("MyView", model);
}
catch (Exception ex)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
return View("../Error/ShowException", ex);
}
Для пользовательского просмотра для 404 я сделал это в global.asax:
protected void Application_OnError( )
{
var exception = Server.GetLastError( );
Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
Helper.SetSessionValue(SessionKeys.EXCEPTION, exception);
Response.Redirect( "~/Error/ShowException");
}
Для jqgrid я сделал это в моем контроллере:
[HttpPost]
public ActionResult ListRecords( int page , DateTime? fromdate , DateTime? todate)
{
try
{
var list = FetchListFromDB();
var result = new
{
total = Math.Ceiling(list.Count / (decimal)Helper.PAGE_SIZE),
page = page, //--- current page
records = list.Count, //--- total items
rows = list.List.Select(x => new
{
id = x.EntityID,
cell = new string[]
{
x.Property1,
x.Property2
}
}).ToArray()
};
return Json(result, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
var result = new
{
errorMessage = "An unexpected error occurred while fetching data. An automatic email has been generated for the support team who will address this issue shortly. Details: " + ex.Message,
records = 0
};
Elmah.ErrorSignal.FromCurrentContext().Raise(ex);
return Json(result, JsonRequestBehavior.AllowGet);
}
И это в представлении (в определении jqgrid):
loadComplete:function(data)
{
if (data.errorMessage)
{
alert(data.errorMessage);
}
},
В общем сценарии ajax:
success: function(data)
{
if (data.errorMessage)
{
alert(data.errorMessage);
}
else
{
//...
}
},
а. Является ли правильный способ НЕ реализовывать какие-либо попытки catch в контроллерах (или где-либо еще в этом отношении) и позволить Elmah позаботиться об исключениях?
Я бы сказал, что Элма не "заботится" об исключениях, а записывает их. В идеале, вы должны попытаться обработать ошибки - во что бы то ни стало зарегистрировать их, но также добавить логику для их устранения, чтобы они не прерывали рабочий процесс пользователя.
Я бы обернул логику в try
блоки, а в catch
использование
Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
записывать все, что идет не так. Однако сразу после этой строки я бы сделал что-то, чтобы попытаться восстановиться после исключения - поймать определенные типы исключений, а не просто catch (Exception e)
и иметь дело с ними после регистрации их. Идея заключается в том, что вы должны просматривать свои журналы, выяснять, что вызывает исключения, и улучшать вашу программу, чтобы она больше не генерировала исключения.
Чтобы показать свои собственные страницы ошибок, есть HandleErrorAttribute
или, если вы не хотите использовать, есть также контроллер OnException()
метод, который вызывается, когда метод действия контроллера завершается с исключением, а не завершается нормально. ExceptionContext
объект передается в этот метод, так что вы можете использовать его, чтобы получить сгенерированное исключение и записать его в журнал, выполнить любую очистку, которая может потребоваться, и т. д.
Я знаю, что очень опаздываю на вечеринку, но наткнулся на этот ответ, когда искал что-то похожее в Google.
Мне не нравится использование блоков try catch везде в моем коде, особенно в веб-приложениях. Я позволил Элме поймать все и записать это за кулисы. Затем в файле web.config вы можете перенаправить в зависимости от типа ошибки...
<customErrors mode="RemoteOnly" defaultRedirect="~/Error" >
<error statusCode="500" redirect="~/Error"/>
<error statusCode="404" redirect="~/NotFound"/>
</customErrors>