先说结论
1.在方法内部已经处理过的异常,是否可以捕捉到? 无法捕捉 处理过的异常就不是异常了
2.在方法内部没有处理过的异常,是否可以捕捉到? 可以捕捉
3.在控制器构造函数中发生的异常,是否可以捕捉到? 可以捕捉
4.在Servcie层发生的异常是否可以捕捉到? 可以捕捉 Service层是Di层的下层,异常的抛出是从下往上抛出;
5.在Filter内部发生的异常是否可以捕捉到? 部分可以,部分不可以
6.在视图中如果发生异常,是否可以捕捉到? 无法捕捉
7.请求的链接错误,异常是否可以捕捉都呢? 无法捕捉
如果只使用这个ExcptionFilter来做异常的处理。其实不够的;
需要使用ExcptionFilter+中间件
ExcptionFilter过滤器
public class CustomAsyncExceptionFilterAttribute : Attribute, IAsyncExceptionFilter
{
private readonly IModelMetadataProvider _IModelMetadataProvider;
public CustomAsyncExceptionFilterAttribute( IModelMetadataProvider iModelMetadataProvider )
{
_IModelMetadataProvider = iModelMetadataProvider;
}
/// <summary>
/// 异步捕捉异常
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public Task OnExceptionAsync(ExceptionContext context)
{
if ( context.ExceptionHandled == false ) // 表示异常没被处理
{
// 开始处理异常 返回一个异常提示页面 或者 json格式给用户
{
if ( IsAjaxRequest(context.HttpContext.Request) )
{
// 返回json
context.Result = new JsonResult(new
{
code = 500,
msg = context.Exception.Message
});
}
else
{
// 返回页面
ViewResult result = new ViewResult { ViewName = "~/Views/Shared/Error.cshtml" };
result.ViewData = new ViewDataDictionary(_IModelMetadataProvider, context.ModelState);
result.ViewData.Add("Exception", context.Exception);
context.Result = result;
}
}
context.ExceptionHandled = true; // 表示异常已经被处理过了
}
return Task.CompletedTask;
}
private bool IsAjaxRequest(HttpRequest request)
{
string header = request.Headers["X-Requested-With"];
return "XMLHttpRequest".Equals(header);
}
}
中间件配置
#region 异常处理中间件
// 当发生HTTP错误状态码时,重新执行特定的Razor视图页面。
app.UseStatusCodePagesWithReExecute("/Shared/Error.cshtml");
app.UseExceptionHandler(errorApp =>
{
errorApp.Run(async context =>
{
context.Response.StatusCode = 200;
context.Response.ContentType = "text/html";
await context.Response.WriteAsync("<html lang=\"en\"><body>\r\n");
await context.Response.WriteAsync("ERROR!<br><br>\r\n");
var exceptionHandlerPathFeature =
context.Features.Get<IExceptionHandlerPathFeature>();
Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
Console.WriteLine($"{exceptionHandlerPathFeature?.Error.Message}");
Console.WriteLine("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
if (exceptionHandlerPathFeature?.Error is FileNotFoundException)
{
await context.Response.WriteAsync("File error thrown!<br><br>\r\n");
}
await context.Response.WriteAsync("<a href=\"/\">Home</a><br>\r\n");
await context.Response.WriteAsync("</body></html>\r\n");
await context.Response.WriteAsync(new string(' ', 512)); // IE padding
});
});
#endregion