Filter——ExceptionFilter异常筛选器(1)
ExceptionFilter异常筛选器
一、什么是Filter
aaa();
bbbb();
ccc();
我们原本的代码逻辑就三行,
aaa();
log();
bbbb();
log()
ccc();
但一些跟业务逻辑不想关的代码,大量出现。会影响业务逻辑的清晰性。
所以可以通过特定的Filter将不相关的代码放到一个统一的地方。

二、在不同环境下,异常响应
1.开发环境下
读入一个不存在的文件
[HttpGet]
public string Test1()
{
//因为ControllerBase有个File方法
//string result = File.ReadAllText("f:/1.text");
string result = System.IO.File.ReadAllText("f:/1.text");
return result;
}

2.在生产环境下
1.关闭开发环境
右键项目,打开属性,
删除ASPNETCORE_ENVIRONMENT=Development
2.运行环境
直接在地址栏输入路由地址
打开F12,查看响应。

三、自定义异常信息

1.定义异常处理类
注册两个类,来体现ExceptionHandled的用处
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
namespace _04_Filter
{
public class MyExceptionFilter : IAsyncExceptionFilter
{
private readonly IWebHostEnvironment hostEnv;
public MyExceptionFilter(IWebHostEnvironment hostEnv)
{
this.hostEnv = hostEnv;
}
public Task OnExceptionAsync(ExceptionContext context)
{
//context.Exception代表异常信息。
//context.ExceptionHandled赋值为true,则ExceptionHandled不会在执行
//context.Result的值会输出给客户端
string msg;
if(hostEnv.IsDevelopment())
{
msg = context.Exception.ToString();
}
else
{
msg = "服务端发生未处理的异常";
}
//定义的异常信息
ObjectResult objectResult = new ObjectResult(new {code = 500,message = msg});
//信息传给客户端
context.Result = objectResult;
//如果只是记录不进行处理,就不需要写这个
context.ExceptionHandled = true;
context.Result = objectResult;
return Task.CompletedTask;
}
}
}
using Microsoft.AspNetCore.Mvc.Filters;
namespace _04_Filter
{
public class FilterTest1 : IAsyncExceptionFilter
{
public Task OnExceptionAsync(ExceptionContext context)
{
return File.AppendAllTextAsync("d:/error.log", context.Exception.ToString());
}
}
}
2.在program注册
这里的顺序不能乱,后增加的Filter先执行,当两个位置调换,因为MyExceptionFilter有ExceptionHandled 所以不会执行FilterTest1
builder.Services.Configure<MvcOptions>(opt =>
{
opt.Filters.Add<MyExceptionFilter>();
opt.Filters.Add<FilterTest1>();
}
) ;
3.访问路由


浙公网安备 33010602011771号