NetCore——自定义全局异常处理
自定义全局异常处理
一、UserFriendlyException自定义用户友好错误消息
public class UserFriendlyException : BusinessException
{
public UserFriendlyException(
string message,
System.Exception innerException = null)
//message传递给父类BusinessException
: base(
message,
innerException)
{
}
}
二、BusinessException
//继承了系统异常
public class BusinessException : System.Exception,
IBusinessException
{
public LogLevel LogLevel { get; set; }
public BusinessException(
//UserFriendlyException(message)传递给Business的message
string message = null,
System.Exception innerException = null)
//传递给系统异常的message(异常消息)
: base(message, innerException)
{
}
}
三、自定义异常消息格式AjaxResponse
public class AjaxResponse<TData>
{
/// <summary>
/// 异常消息
/// </summary>
public string Message { get; set; }
public AjaxResponse()
{
}
public AjaxResponse(TData data)
{
}
public AjaxResponse(string msg, bool success = false)
{
Message = msg;
}
public static AjaxResponse<TData> Result(bool isSuccess, int code, TData data, string message)
{
return new AjaxResponse<TData>
{
Message = message
};
}
四、StudentExceptionFilter自定义异常类
public class StudentExceptionFilter:IExceptionFilter
{
/// <summary>
/// 重写OnExceptionAsync方法,定义自己的处理逻辑
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public void OnException(ExceptionContext context)
{
//当使用UserFriendly后,自定义的异常消息,传入到了系统异常中
var exception = context.Exception; //获取异常消息的
//自定义错误消息的格式
var errorInfo = new AjaxResponse<object>("业务处理失败");
//AjaxResponse中的message设置为,返回的异常消息的message
errorInfo.Message = exception.Message;
//设置返回结果为AjaxResponse格式的消息
context.Result = new ObjectResult(errorInfo);
//设置该异常已被处理,因为异常处理不是只有一处,设置处理,其他地方将不在处理
context.ExceptionHandled = true; //Handled!
//设置异常为空
context.Exception = null; //Handled!
}
}
五、自定义异常注入到StartUp中
services.AddControllersWithViews(
options => {
options.Filters.Add(typeof(StudentExceptionFilter));
}
)
六、自定义异常中间件
第一种当发生异常时,会进入到这里,处理异常信息,并返回
app.UseExceptionHandler(new ExceptionHandlerOptions{
ExceptionHandler = async context=>
{
//包含错误的原始路径
var exhandle = context.Features.Get<IExceptionHandlerFeature>();
var ex = exhandle.Error;
if(ex !=null)
{
context.Response.ContentType = "text/plain;charset=utf-8";
await context.Response.WriteAsync(ex.ToString());
}
}
});
异常进来后,可以将错误转发到不同的异常处理,在program 中添加如下代码。
app.UseExceptionHandler(new ExceptionHandlerOptions
{
//将异常转到/error路径进行处理
ExceptionHandlingPath = new PathString("/error")
});
/error路径错误处理逻辑
app.MapGet("/error",()=>{
return "error1";
});
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!