【问题标题】:How to get exception details on shared error.cshtml如何获取有关共享 error.cshtml 的异常详细信息
【发布时间】:2014-02-28 16:11:05
【问题描述】:

我正在使用带有在 Global.asax 上配置的 HandleErrorAttribute 过滤器的 ASPNet MVC4

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

在我的 web.config 上,我已将 customError 模式配置为 RemoteOnly:

<customErrors mode="RemoteOnly" />

因此,当任何 View 引发异常时,用户将被重定向到 ~/Shared/Error.cshtml,这没关系。

现在,我可以为日志捕获此异常:

~/Shared/Error.cshtml 代码:

@{
    log4net.LogManager
      .GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
      .Fatal("Not captured exception", ex);
}

实际上这段代码工作正常(没有 EX 参数),但我需要改进我的日志,包括异常详细信息。

如何在此页面上获取异常详细信息?

【问题讨论】:

    标签: asp.net asp.net-mvc razor exception-handling log4net


    【解决方案1】:

    只需将您的Error.cshtml 视图强类型化为HandleErrorInfo,这是由 HandleErrorAttribute 传递给此视图的模型:

    @model System.Web.Mvc.HandleErrorInfo
    @{
        log4net
            .LogManager
            .GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
            .Fatal("Not captured exception", Model.Exception);
    }
    

    顺便说一句,在视图中登录似乎不是您能做的最干净的事情。我宁愿编写我的自定义错误处理程序属性并在那里记录异常。

    【讨论】:

    • 我测试了你的代码,效果很好,这也是一个正确的答案。由于 SO 不接受两个答案,因此我必须选择鸽子的答案,因为避免在 View 上编码。为你 +1。
    【解决方案2】:

    我建议编写一个自定义处理程序并在其中登录,例如

    [AttributeUsage(AttributeTargets.All, Inherited = true)]
    public class HandleErrorAttributeCustom : HandleErrorAttribute
    {
    
        public override void OnException(ExceptionContext context)
        {
                    base.OnException(context);
               log4net.LogManager
              .GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
              .Fatal("Not captured exception", context.Exception);
        }
    }
    

    【讨论】:

    • 另外不要忘记注册自定义句柄类,例如将 filters.Add(new HandleErrorAttribute()); 替换为 FilterConfig 类中的 filters.Add(new HandleErrorAttributeCustom()); 或 Global.asax.cs 中的 Application_Start() /跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2019-01-20
    相关资源
    最近更新 更多