在程序设计中,我们会遇到各种各样的异常问题,一个好的异常处理解决方案能够帮助开发者快速的定位问题,也能够给用户更好的用户体验。那么我们在AspNetCore中该如何捕获和处理异常呢?我们以一个WebApi项目为例,讲解如何捕获和处理异常。
开发过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;
}
}
}
Copyright © 2004-2024 Ynicp.com 版权所有 法律顾问:建纬(昆明)律师事务所 昆明市网翼通科技有限公司 滇ICP备08002592号-4