1、net 8 webapi 全局异常处理:
在 .NET 8 WebAPI 中,全局异常处理可以通过实现**
IExceptionHandler
接口或使用IAsyncExceptionFilter
接口来完成**。首先,关于
IExceptionHandler
接口,它是ASP.NET Core中用于全局异常处理的新抽象。这个接口有一个方法TryHandleAsync
,它尝试处理ASP.NET Core管道中的指定异常。如果该方法能够处理异常,则应返回true
;如果不能处理,则应返回false
。这样的设计允许开发者为不同的场景实现自定义的异常处理逻辑。其次,
IAsyncExceptionFilter
是IExceptionFilter
的异步版本,它也可以用来捕获异常。在ASP.NET程序开发中,使用IAsyncExceptionFilter
是一种推荐的做法,因为它支持异步操作,可以避免阻塞线程,提高应用程序的性能和响应能力。综上所述,要实现全局异常处理,你可以创建一个类实现
IExceptionHandler
接口或者IAsyncExceptionFilter
接口,并在Startup
类的ConfigureServices
方法中将其添加到服务集合中。这样,当WebAPI发生未处理的异常时,你的全局异常处理程序就会被调用,从而可以进行相应的处理,如记录日志、返回自定义错误响应等。
2、配置全局处理文件
/// <summary>/// 全局异常错误日志/// </summary>public class GlobalExceptionsFilter : IExceptionFilter{private readonly ILogger<GlobalExceptionsFilter> _logger;public GlobalExceptionsFilter(ILogger<GlobalExceptionsFilter> logger){_logger = logger;}public void OnException(ExceptionContext context){var apiResult = new ApiResult();//ApiResult,首字母小写问题。apiResult.msg = context.Exception.Message;//错误信息apiResult.code = 410;var res = new ContentResult();res.Content = JsonConvert.SerializeObject(apiResult);context.Result = res;//进行错误日志记录_logger.LogError(apiResult.msg + WriteLogInfo(apiResult.msg, context.Exception));}/// <summary>/// 定义返回格式/// </summary>/// <param name="throwMsg"></param>/// <param name="ex"></param>/// <returns></returns>public string WriteLogInfo(string throwMsg, Exception ex){return string.Format("\r\n【自定义错误】:{0} \r\n【异常类型】:{1} \r\n【异常信息】:{2} \r\n【堆栈调用】:{3}", new object[] { throwMsg,ex.GetType().Name, ex.Message, ex.StackTrace });}}
3、注入
builder.Services.AddControllers(o =>
{o.Filters.Add(typeof(GlobalExceptionsFilter));//全局异常处理
});
4、测试代码
/// <summary>/// 测试连接1/// 异常/// </summary>/// <param name="t">字符串</param>/// <returns></returns>[HttpGet][ApiVersionCustomRoute(SwaggerDocSettings.ApiVersions.v1)]public ApiResult Test(string t){int i = 0;try{i = int.Parse(t);}catch (Exception ex){_logger.LogError("Test接口异常:" + ex.Message.ToString());return ApiResultHelper.Error("转化失败", ex.Message.ToString());}return ApiResultHelper.Success("转化成功!");}
4.1、运行不会进入全局处理。因为已经有try处理了,去掉再试下。
4.2、成功进入
5、后续可考虑写入txt或者数据库