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或者数据库