【问题标题】:How to log exception globally without using try catch statement如何在不使用 try catch 语句的情况下全局记录异常
【发布时间】:2019-12-23 23:11:19
【问题描述】:

我的项目中有几个 try catch 语句,但我想记录所有异常而不将其放入 catch 语句中。

有没有办法在不将日志记录逻辑像下面的代码一样放在 catch 语句中的情况下监控所有异常?

// codes.
try {
    // doing something.
} catch (e) {
   return "error message"
}

// global.ascx
protected void Application_Error(object sender, EventArgs e)
{
   // Logging Logic goes here.
}

【问题讨论】:

    标签: asp.net-mvc logging error-handling global


    【解决方案1】:

    简而言之,没有。自动捕获错误的所有方法,您可以集中处理日志记录,捕获未处理的错误。通过手动捕获和处理/抑制它们,您还需要手动记录。

    【讨论】:

      【解决方案2】:

      您可以使用 IExceptionFilter 接口来捕获所有错误。这是示例。我有自定义日志记录。所以你可以自定义它。

      using System;
      using System.Diagnostics;
      using System.Web.Mvc;
      
      namespace ProjectName.Helpers
      {
          public class ExceptionFilter : IExceptionFilter
          {
              public void OnException(ExceptionContext filterContext)
              {
                  Trace.TraceError(filterContext.Exception.ToString());
      
                  if (filterContext.Exception.InnerException != null)
                  {
                      Trace.TraceError(filterContext.Exception.InnerException.ToString());
                  }
      
                  var st = new StackTrace(filterContext.Exception, true);
                  var frame = st.GetFrame(0);
                  var lineNumber = frame.GetFileLineNumber();
      
                  var log = new LogObj
                  {
                      DateInserted = DateTime.Now,
                      LogType = LogType.Exception,
                      Controller = filterContext.RouteData != null ? (string)filterContext.RouteData.Values["controller"] : "",
                      Action = filterContext.RouteData != null ? (string)filterContext.RouteData.Values["action"] : "",
                      RouteDataId = filterContext.RouteData != null ? (string)filterContext.RouteData.Values["id"] : "",
                      Message = filterContext.Exception.ToString(),
                      ExceptionMessage = filterContext.Exception.Message,
                      InnerExceptionMessage = filterContext.Exception.InnerException != null ? filterContext.Exception.InnerException.ToString() : "",
                      InnerExceptionSource = filterContext.Exception.Source,
                      InnerExceptionStackTrace = filterContext.Exception.StackTrace,
                      ExceptionDetails = "File: " + frame.GetFileName() + " - Line: " + lineNumber
                  };
      
                  LogHelper.WriteLog(LogTarget.Exception, log);
              }
          }
      }
      

      并且您需要在 App_Start/FilterConfig.cs 上注册此过滤器。

      using System.Web.Mvc;
      
      namespace MailBulletin
      {
          public class FilterConfig
          {
              public static void RegisterGlobalFilters(GlobalFilterCollection filters)
              {
                  filters.Add(new ExceptionFilter());
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-09
        • 2014-09-09
        • 2012-05-05
        • 2014-08-23
        • 2011-08-25
        • 2019-11-19
        • 2014-04-15
        • 1970-01-01
        • 2016-11-27
        相关资源
        最近更新 更多