我看过很多帖子和文章但是我无法清楚地看到解决方案。
我已经通过NuGet安装了Elmah.MVC,并从FilterConfig.cs注释掉了这一行:
//filters.Add(new HandleErrorAttribute());
这样Elmah就会发现错误。
当我提供无效的操作名称时,它会生效,我会收到黄页和电子邮件。
我想知道我的代码可能生成的其他两种错误......我们应该如何处理它们:
1.E.g。如果我的存储库或经理(业务逻辑)层在尝试访问数据库或发送电子邮件等时抛出异常。
一个。是不是在控制器(或其他任何地方)实现任何类型的try catch的正确方法,让Elmah处理异常?
湾如果是这样,如果它显示黄色错误页面,我们如何显示自己喜欢的视图?
2.如果我的观点包含ajax调用,例如通过jqgrid,在幕后有错误,我注意到他们也被Elmah正确选中了。但是,我如何向用户显示某种错误消息?
由于
答案 0 :(得分:4)
这是我做的:
在控制器中,我放置了try 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
{
//...
}
},
答案 1 :(得分:2)
一个。是不是在控制器(或其他任何地方)实现任何类型的try catch的正确方法,让Elmah处理异常?
我会说Elmah没有“照顾”异常,它会记录它们。理想情况下,您应该尝试处理错误 - 无论如何都要记录它们,还要添加逻辑来处理它们,这样它们就不会中断用户的工作流程。
我将try
块中的逻辑包含在catch
中
Elmah.ErrorSignal.FromCurrentContext().Raise(exception);
记录任何出错的地方。然而,在该行之后,我会立即尝试从异常中恢复 - 捕获特定的异常类型,而不仅仅是catch (Exception e)
,并在记录它们之后处理它们。我们的想法是,您应该检查您的日志,找出导致异常的原因,并改进您的程序,以便它不再抛出异常。
要显示您自己的错误页面,有HandleErrorAttribute
,或者如果您不想使用它,那么还有控制器的OnException()
方法,当控制器操作方法退出时会调用该方法异常而不是正常结束。将ExceptionContext
对象传递给该方法,因此您可以使用它来获取抛出的异常并记录它,执行可能需要的任何清理等。
答案 2 :(得分:0)
我知道我参加派对的时间已经很晚了,但我在搜索类似Google的内容时偶然发现了这个答案。
我不喜欢在我的代码中使用try catch块,特别是在Web应用程序中。我让Elmah抓住一切并在幕后记录。然后在web.config文件中,您可以根据错误类型重定向...
<customErrors mode="RemoteOnly" defaultRedirect="~/Error" >
<error statusCode="500" redirect="~/Error"/>
<error statusCode="404" redirect="~/NotFound"/>
</customErrors>