如何获取共享error.cshtml的异常详细信息

时间:2014-02-28 16:11:06

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

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

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

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

<customErrors mode="RemoteOnly" />

因此,当在任何视图上引发异常时,用户被重定向到〜/ Shared / Error.cshtml,这没关系。

现在,我可以捕获日志的这个例外:

〜/ Shared / Error.cshtml代码:

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

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

如何在此页面上获取异常详情?

2 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:8)

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

[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);
    }
}