夫天地者,万物之逆旅;光阴者,百代之过客。而浮生若梦,为欢几何?
.Net Core 项目实战:统一异常处理中间件

组件需求

捕获Web运行期间出现的系统级异常和业务级异常,对这些异常进行记录并给客户端返回统一的响应结果。

ExceptionMiddleware 核心实现

.Net Core 自定义中间件很简单,在 Invoke 方法中执行我们的处理逻辑,使用 RequestDelegate 将请求交给下个管道。

/// <summary>
    /// API统一异常处理中间件
    /// </summary>
    public class ExceptionMiddleware
    {
        /// <summary>
        /// 
        /// </summary>
        private readonly ILogger _Logger;
        /// <summary>
        /// 
        /// </summary>
        private readonly RequestDelegate _next;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="next"></param>
        public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> logger)
        {
            _next = next;
            _Logger = logger;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="httpContext"></param>
        /// <returns></returns>
        public async Task Invoke(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext);
            }
            catch (BizException ex)
            {
                // 处理业务级别异常
                await HandleExceptionAsync(httpContext, ex.Errcode, ex);
            }
            catch (Exception ex)
            {
                // 错误系统级别异常
                await HandleExceptionAsync(httpContext, 500, ex);
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        /// <param name="statusCode"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        private Task HandleExceptionAsync(HttpContext context, int statusCode, Exception ex)
        {
            try
            {
                // 加入异常捕获,防止异常记录出错导致的响应失败
                _Logger.LogError(ex, ex.Message);
            }
            catch (Exception)
            {
            }
            var data = new { errcode = statusCode, success = false, message = ex.Message };
            var result = JsonConvert.SerializeObject(data);
            context.Response.ContentType = "application/json;charset=utf-8";
            return context.Response.WriteAsync(result);
        }
    }

创建IApplicationBuilder扩展方法UseIMExceptionHandler

新建一个静态类,添加IApplicationBuilder的扩展方法UseIMExceptionHandler,这样在Startup 的Configure方法中就能使用 app.UseIMExceptionHandler()的形式添加我们的中间件了。

/// <summary>
    /// 
    /// </summary>
    public static class ExceptionHandlerBuilderExtensions
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="builder"></param>
        /// <returns></returns>
        public static IApplicationBuilder UseIMExceptionHandler(this IApplicationBuilder builder)
        {
            builder.UseMiddleware<ExceptionMiddleware>();
            return builder;
        }
    }

Startup 使用

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.UseIMExceptionHandler();
            app.UseMvc();
        }

使用注意:我们的异常处理中间件一定要放到其他中间件的最前面,这样才能保证后续请求管道发生异常后能捕获。

作者:暗夜余晖

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

0

支持

0

反对

posted @2019-2-2  拜读(816)

评论列表

评论内容:



喜欢请打赏

支付宝 微信

请放心支付