首页 > 编程语言 >Asp.Net Core中有哪些异常处理

Asp.Net Core中有哪些异常处理

时间:2022-10-21 16:45:53浏览次数:43  
标签:Core exception Asp OnActionExecuted Exception next context Net public

1.继承Controller,重写OnActionExecuted

默认都会继承一个Controller类,重写OnActionExecuted,添加上异常处理即可。一般情况下我们会新建一个BaseController, 让所有Controller继承BaseController。代码如下

 1 public class BaseController : Controller
 2 {
 3     public override void OnActionExecuted(ActionExecutedContext context)
 4     {
 5         var exception = context.Exception;
 6         if (exception != null)
 7         {
 8             context.ExceptionHandled = true;
 9             context.Result = new ContentResult
10             {
11                 Content = $"BaseController错误 : { exception.Message }"
12             };
13         }
14         base.OnActionExecuted(context);
15     }
16 }

 

2.使用 ActionFilterAttribute。

ActionFilterAttribute是一个特性,本身实现了 IActionFilter 及 IResultFilter , 所以不管是action里抛错,还是view里抛错,理论上都可以捕获。我们新建一个 ExceptionActionFilterAttribute, 重写 OnActionExecuted及OnResultExecuted,添加上异常处理,完整代码如下:

 1 public class ExceptionActionFilterAttribute:ActionFilterAttribute
 2 {
 3     public override void OnActionExecuted(ActionExecutedContext context)
 4     {
 5         var exception = context.Exception;
 6         if (exception != null)
 7         {
 8             context.ExceptionHandled = true;
 9             context.Result = new ContentResult
10             {
11                 Content = $"错误 : { exception.Message }"
12             };
13         }
14         base.OnActionExecuted(context);
15     }
16 
17     public override void OnResultExecuted(ResultExecutedContext context)
18     {
19         var exception = context.Exception;
20         if (exception != null)
21         {
22             context.ExceptionHandled = true;
23             context.HttpContext.Response.WriteAsync($"错误 : {exception.Message}");
24         }
25         base.OnResultExecuted(context);
26     }
27 }

 

使用方式有两种,
在controller里打上 [TypeFilter(typeof(ExceptionActionFilter)] 标签;

在Startup里以filter方式全局注入。

1 services.AddControllersWithViews(options =>
2 {
3     options.Filters.Add<ExceptionActionFilterAttribute>();
4 })

 

3.使用 IExceptionFilter

我们知道, Asp.Net Core提供了5类filter, IExceptionFilter是其中之一,顾名思义,这就是用来处理异常的。Asp.net Core中ExceptionFilterAttribute已经实现了IExceptionFilter,所以我们只需继承ExceptionFilterAttribute,重写其中方法即可。 同样新建CustomExceptionFilterAttribute继承 ExceptionFilterAttribute,重写 OnException ,添加异常处理,完整代码如下:

1 public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
2 {
3     public override void OnException(ExceptionContext context)
4     {
5         context.ExceptionHandled = true;
6         context.HttpContext.Response.WriteAsync($"CustomExceptionFilterAttribute错误:{context.Exception.Message}");
7         base.OnException(context);
8     }
9 }

 

4.使用ExceptionHandler

在 startup.cs 里,vs新建的项目会默认加上.

1 if (env.IsDevelopment())
2 {
3     app.UseDeveloperExceptionPage();
4 }
5 else
6 {
7     app.UseExceptionHandler("/Home/Error");
8 }

 

5.自定义Middleare处理

通过middleware全局处理。

 1 public class ErrorHandlingMiddleware
 2 {
 3    private readonly RequestDelegate next;
 4 
 5    public ErrorHandlingMiddleware(RequestDelegate next)
 6    {
 7         this.next = next;
 8    }
 9 
10    public async Task Invoke(HttpContext context)
11    {
12         try
13         {
14            await next(context);
15         }
16         catch (System.Exception ex)
17         {
18            //处理异常
19         }
20    }
21 }

 如有侵权,请联系作者,将进行整改

标签:Core,exception,Asp,OnActionExecuted,Exception,next,context,Net,public
From: https://www.cnblogs.com/2023-02-14/p/16813964.html

相关文章