可以定义好一些全体的关于服务器端的异常处理

时间:2022-01-04 07:58:28

其实对付C#异常措置惩罚惩罚大家都不陌生,但是对付在WeiApi上的异常措置惩罚惩罚实际上也和传统异常措置惩罚惩罚区别不大,但是却颠末封装可以让异常越发友好,https://docs.microsoft.com/en-us/aspnet/web-api/overview/error-handling/exception-handling,通过微软的官方介绍,我们可以知道WeiApi可以简单概述为三种异常,接下来我们围绕这三种异常给出例子,如何封装和措置惩罚惩罚以上三种异常

异常过滤

               异常过滤器实现了System.Web.Http.Filters.IExceptionFilter接口。编写异常过滤器最简单的要领是从System.Web.Http.Filters.ExceptionFilterAttribute派生并重写OnException要领。Microsoft给出的关于异常过滤器解释,那么如何实现呢?通过阅读《Asp.NET  WEB API2 框架揭秘》,我们知道每一次客户端请求API城市通过HTTP请求,处事端得到功效输出response到客户端。这个过程中,一旦处事端产生异常,会统一向客户端返回500的错误。

              那么在Web API中如何界说NotImplementedException类?首先在App_Start里面新建一个类WebApiExceptionFilterAttribute.cs,担任ExceptionFilterAttribute,重写OnException要领,代码如下

1 public class WebApiExceptionFilterAttribute : ExceptionFilterAttribute 2 { 3 //重写基类的异常措置惩罚惩罚要领 4 public override void OnException(HttpActionExecutedContext actionExecutedContext) 5 { 6 //1.异平日志记录(正式项目里面一般是用log4net记录异平日志) 7 Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "——" + 8 actionExecutedContext.Exception.GetType().ToString() + "" + actionExecutedContext.Exception.Message + "——仓库信息:" + 9 actionExecutedContext.Exception.StackTrace); 10 11 //2.返回挪用方具体的异常信息 12 if (actionExecutedContext.Exception is NotImplementedException) 13 { 14 actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented); 15 } 16 else if (actionExecutedContext.Exception is TimeoutException) 17 { 18 actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.RequestTimeout); 19 } 20 //.....这里可以按照项目需要返回到客户端特定的状态码。如果找不到相应的异常,统一返回处事端错误500 21 else 22 { 23 actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError); 24 } 25 26 base.OnException(actionExecutedContext); 27 } 28 }

View Code

代码解析:通过判断异常的具体类型,向客户端返回差此外http状态码,示例里面写了两个,可以按照项目的实际情况加一些特定的我们想要捕获的异常,然后将对应的状态码写入http请求的response里面,对付一些我们无法判断类型的异常,,统一返回处事端错误500。Microsoft也有一个代码实现,但是没有封装

 注册异常过滤

         有几种要领可以注册Web API异常过滤器: 

接口级别

控制器级别

全局配置

       要将过滤器应用于特定操纵,请将过滤器作为属性添加到操纵中:

public class ProductsController : ApiController { [NotImplExceptionFilter] public Contact GetContact(int id) { throw new NotImplementedException("This method is not implemented"); } }

  要将过滤器应用于控制器上的所有操纵,请将过滤器作为属性添加到控制器类中:

[NotImplExceptionFilter] public class ProductsController : ApiController { // ... }