关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

.NET Core:处理全局异常

发布时间:2020-08-07 18:34:48

一、前言

在程序设计中,我们会遇到各种各样的异常问题,一个好的异常处理解决方案能够帮助开发者快速的定位问题,也能够给用户更好的用户体验。那么我们在AspNetCore中该如何捕获和处理异常呢?我们以一个WebApi项目为例,讲解如何捕获和处理异常。

二、异常处理

1、异常处理

开发过ASP.NET程序的人都知道:IExceptionFilter。这个过滤器同样在AspNetCore中也可以用来捕获异常。不过,对于使用IExceptionFilter,更建议使用它的异步版本:IAsyncExceptionFilter。那么该如何使用过滤器呢?下面以IAsyncExceptionFilter为例,对于同步版本其实也是一样的。

我们在项目中添加一个Model文件夹,存放返回结果实体类,这里定义一个泛型类:

 

using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;

namespace ExceptionDemo.Model

{

    public class ResultModel<T>

    {

        /// <summary>

        /// 返回结果编码 0:失败 1:成功

        /// </summary>

        public int ResultCode { get; set; }

 

        /// <summary>

        /// 返回结果内容 成功:Success  失败:异常内容

        /// </summary>

        public string ResultMsg { get; set; }

 

        /// <summary>

        /// 返回结果 成功:返回T类型数据 失败:默认null

        /// </summary>

        public T ResultData { get; set; }

    }

}

 

 

我们在项目中添加一个Filter文件夹,所有的过滤器都放在该文件夹下面。然后添加一个类:CustomerExceptionFilter,并使该类继承自IAsyncExceptionFilter。代码如下:

 

using ExceptionDemo.Model;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;using Microsoft.AspNetCore.Mvc.Filters;using Newtonsoft.Json;using System.Threading.Tasks;

namespace ExceptionDemo.Filter

{

    /// <summary>

    /// 自定义异常过滤器

    /// </summary>

    public class CustomerExceptionFilter : IAsyncExceptionFilter

    {

        /// <summary>

        /// 重写OnExceptionAsync方法,定义自己的处理逻辑

        /// </summary>

        /// <param name="context"></param>

        /// <returns></returns>

        public Task OnExceptionAsync(ExceptionContext context)

        {

            // 如果异常没有被处理则进行处理

            if(context.ExceptionHandled==false)

            {

                // 定义返回类型

                var result = new ResultModel<string>

                {

                    ResultCode = 0,

                    ResultMsg = context.Exception.Message

                };

                context.Result = new ContentResult

                {

                    // 返回状态码设置为200,表示成功

                      StatusCode = StatusCodes.Status200OK,

                      // 设置返回格式

                      ContentType="application/json;charset=utf-8",

                      Content=JsonConvert.SerializeObject(result)

                };

            }

            // 设置为true,表示异常已经被处理了

            context.ExceptionHandled = true;

            return Task.CompletedTask;

        }

    }

}



/template/Home/Zkeys/PC/Static