4

我看过许多帖子和文章,但无法清晰地看到解决方案。

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

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

这样 Elmah 就会发现错误。

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

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

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

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

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

2.如果我的视图包含ajax 调用,例如通过jqgrid,并且在幕后有错误,我注意到它们也被Elmah 正确拾取。但是我如何也向用户显示某种错误消息呢?

谢谢

4

3 回答 3

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
            {
                           //...
            }
        },
于 2013-08-13T09:43:09.087 回答
2

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

我会说 Elmah 不会“处理”异常,它会记录它们。理想情况下,您应该尝试处理错误 - 一定要记录它们,但还要添加逻辑来处理它们,这样它们就不会中断用户的工作流程。

我会将逻辑包装在try块中,并在catch使用 中

Elmah.ErrorSignal.FromCurrentContext().Raise(exception);

记录任何出错的地方。然而,紧接着该行之后,我会做一些事情来尝试从异常中恢复 - 捕获特定的异常类型,而不仅仅是catch (Exception e),并在记录它们后处理它们。这个想法是你应该检查你的日志,找出导致异常的原因,并改进你的程序,使它不再抛出异常。

为了显示您自己的错误页面,有HandleErrorAttribute,或者如果您不想使用它,还有控制器的OnException()方法,当控制器操作方法因异常退出而不是正常完成时调用该方法。一个ExceptionContext对象被传递到该方法中,因此您可以使用它来获取引发的异常并记录它,执行任何可能需要的清理等。

于 2013-08-13T09:56:58.790 回答
0

我知道我参加聚会很晚了,但我在搜索类似 Google 的内容时偶然发现了这个答案。

我不喜欢在我的代码中到处使用 try catch 块,尤其是在 Web 应用程序中。我让 Elmah 捕获所有内容并将其记录在幕后。然后在 web.config 文件中,您可以根据错误类型重定向...

 <customErrors mode="RemoteOnly" defaultRedirect="~/Error" >
  <error statusCode="500" redirect="~/Error"/>
  <error statusCode="404" redirect="~/NotFound"/>
</customErrors>
于 2015-05-15T12:39:26.600 回答