Asp.NetCore依赖注入和管道方式的异常处理及日志记录

 

前言

    在业务系统,异常处理是所有开发人员必须面对的问题,在一定程度上,异常处理的能力反映出开发者对业务的驾驭水平;本章将着重介绍如何在 WebApi 程序中对异常进行捕获,然后利用 Nlog 组件进行记录;同时,还将介绍两种不同的
异常捕获方式:管道捕获/服务过滤;通过本练习,将学习到如何捕获异常、处理异常跳转、记录异常信息。

搭建框架

    首先,创建一个 WebApi 项目,选择 Asp.Net Core Web 应用程序;

  • 进一步选择 Api 模板,这里使用的 .netcore 版本为 2.1

  • 取消勾选 “启用 Docker 支持(E)” 和 “为 Https 配置(C)”,点击确定,得到一个完整的 WebApi 项目框架,如图

  • 直接按 F5 运行项目,一切正常,程序启动后进入默认路由调用,并输出结果

异常路由

  • 一切看起来都非常正常和美好,但,祸之福所倚;接下来我们在 接口 Get() 中人为的制造一点麻烦。
        [HttpGet]         public ActionResult<IEnumerable<string>> Get()         {             throw new Exception("出错了.....");              return new string[] { "value1", "value2" };         }
  • 这是由于项目配置了运行环境变量 ASPNETCORE_ENVIRONMENT=Development 后,Startup.cs 中配置了开发环境下,使用系统默认页,所以我们才可以看到上面的异常信息

  • 如果你把环境变量设置为 ASPNETCORE_ENVIRONMENT=Production ,你会发现,在异常发生的时候,你得到了一个空白页。

异常处理方式一:服务过滤

    在传统的 Asp.Net MVC 应用程序中,我们一般都使用服务过滤的方式去捕获和处理异常,这种方式非常常见,而且可用性来说,体验也不错,幸运的是 Asp.Net Core 也完整的支持该方式,接下来创建一个全局异常处理类 CustomerExceptionFilter

public class CustomerExceptionFilter : Attribute, IExceptionFilter {     private readonly ILogger logger = null;     private readonly IHostingEnvironment environment = null;     public CustomerExceptionFilter(ILogger<CustomerExceptionFilter> logger, IHostingEnvironment environment)     {         this.logger = logger;         this.environment = environment;     }      public void OnException(ExceptionContext context)     {         Exception exception = context.Exception;         string error = string.Empty;          void ReadException(Exception ex)         {             error += string.Format("{0} | {1} | {2}", ex.Message, ex.StackTrace, ex.InnerException);             if (ex.InnerException != null)             {                 ReadException(ex.InnerException);             }         }          ReadException(context.Exception);         logger.LogError(error);          ContentResult result = new ContentResult         {             StatusCode = 500,             ContentType = "text/json;charset=utf-8;"         };          if (environment.IsDevelopment())         {             var json = new { message = exception.Message, detail = error };             result.Content = JsonConvert.SerializeObject(json);         }         else         {             result.Content = "抱歉,出错了";         }         context.Result = result;         context.ExceptionHandled = true;     } }
  • CustomerExceptionFilter 继承自 IExceptionFilter 接口,并实现 void OnException(ExceptionContext context) 方法,在 CustomerExceptionFilter
    构造方法中,定义了两个参数,用于记录异常日志和获取程序运行环境变量
<
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信