使用ELMAH和ajax在ASP.Net MVC 4中的Controller中进行异常处理

时间:2013-08-12 14:04:19

标签: asp.net-mvc-4 elmah

我看过很多帖子和文章但是我无法清楚地看到解决方案。

我已经通过NuGet安装了Elmah.MVC,并从FilterConfig.cs注释掉了这一行:

//filters.Add(new HandleErrorAttribute());

这样Elmah就会发现错误。

当我提供无效的操作名称时,它会生效,我会收到黄页和电子邮件。

我想知道我的代码可能生成的其他两种错误......我们应该如何处理它们:

1.E.g。如果我的存储库或经理(业务逻辑)层在尝试访问数据库或发送电子邮件等时抛出异常。

一个。是不是在控制器(或其他任何地方)实现任何类型的try catch的正确方法,让Elmah处理异常?

湾如果是这样,如果它显示黄色错误页面,我们如何显示自己喜欢的视图?

2.如果我的观点包含ajax调用,例如通过jqgrid,在幕后有错误,我注意到他们也被Elmah正确选中了。但是,我如何向用户显示某种错误消息?

由于

3 个答案:

答案 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>