.net core 5 入门
异常处理篇
1.中间件处理异常
和上一篇的log4net配合使用
public class ExceptionHandlingMiddleware
{
//处理http请求的函数
private readonly RequestDelegate _next;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="next"></param>
public ExceptionHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// 收到http请求时
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
var statusCode = context.Response.StatusCode;
await HandleExceptionAsync(context, ex);
}
}
/// <summary>
/// 异常处理
/// </summary>
/// <param name="context"></param>
/// <param name="ex"></param>
/// <returns></returns>
private Task HandleExceptionAsync(HttpContext context, Exception ex)
{
//写入日志
Log4NetUtil.Error(ex.ToString());
//返回json
return context.Response.WriteAsync(JsonConvert.SerializeObject(ExceptionUtils.BuildExceptionResult(ex)));
}
}
2.startup注册
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMiddleware<ExceptionHandlingMiddleware>();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
//app.UseKnife4jUIMiddlewaresHandling();
app.UseSwaggerMiddlewaresHandling();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//services.AddKnife4jSetup();
services.AddSwaggerSetup();
//初始化log4net
Log4NetUtil.InitLog4Net();
//注册全局异常过滤器
services.AddMvc(options =>
{
options.Filters.Add<GlobalExceptionFilter>();//全局异常类
});
}
3.使用过滤器处理异常
/// <summary>
/// 全局异常过滤器
/// </summary>
public class GlobalExceptionFilter : IExceptionFilter
{
/// <summary>
/// 发生异常时
/// </summary>
/// <param name="context"></param>
public void OnException(ExceptionContext context)
{
//如果异常没有被处理过
if (!context.ExceptionHandled)
{
//发生异常的控制器
string controllerName = (string)context.RouteData.Values["controller"];
//发生异常的方法名
string actionName = (string)context.RouteData.Values["action"];
//写入日志
string msgTemplate = $"在执行controller[{controllerName}的{actionName}]方法时产生异常]";
Log4NetUtil.Error(context.Exception.ToString() + "\r\n" + msgTemplate);
//异常标记为已处理
context.ExceptionHandled = true;
//返回异常结果json
context.Result = new ObjectResult(ExceptionUtils.BuildExceptionResult(context.Exception));
}
}
}
4.异常返回工具类
/// <summary>
/// 异常处理工具类
/// </summary>
public class ExceptionUtils
{
/// <summary>
/// 包装处理异常格式
/// </summary>
/// <param name="ex"></param>
/// <returns></returns>
public static object BuildExceptionResult(Exception ex)
{
int code = 0;
string message = "";
string innerMessage = "";
//应用程序业务级异常
if (ex is ApplicationException)
{
code = 501;
message = ex.Message;
}
else
{
// exception 系统级别异常,不直接明文显示的
code = 500;
message = "发生系统级别异常";
innerMessage = ex.Message;
}
if (ex.InnerException != null && ex.Message != ex.InnerException.Message)
{
innerMessage += "," + ex.InnerException.Message;
}
return (new { code, message, innerMessage });
}
}