文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何友好的处理 WebApi 中抛出的错误

2024-12-03 10:41

关注

本文转载自微信公众号「码农读书」,作者码农读书。转载本文请联系码农读书公众号。

微软的 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的rest服务,异常是一种运行时错误,异常处理是一种处理运行时错误的技术,每一个开发者都应该知道如何处理 Web API 中的异常,并且在 Action 中使用合适的 错误码 和 错误信息 进行包装。

WebAPI 中的 HttpResponseException

你可以在 Action 中使用 HttpResponseException 来包装指定的 HttpCode 和 HttpMessage,如下例子所示:

  1. public Employee GetEmployee(int id) 
  2.     Employee emp = employeeRepository.Get(id); 
  3.     if (emp == null
  4.     { 
  5.         var response = new HttpResponseMessage(HttpStatusCode.NotFound) 
  6.         { 
  7.             Content = new StringContent("Employee doesn't exist", System.Text.Encoding.UTF8, "text/plain"), 
  8.             StatusCode = HttpStatusCode.NotFound 
  9.         } 
  10.         throw new HttpResponseException(response); 
  11.     } 
  12.     return emp; 

如果你的 Action 返回的是 IHttpActionResult,那么可将 GetEmployee() 方法修改如下:

  1. public IHttpActionResult GetEmployee(int id) 
  2.     Employee emp = employeeRepository.Get(id); 
  3.     if (emp == null
  4.     { 
  5.         var response = new HttpResponseMessage(HttpStatusCode.NotFound) 
  6.         { 
  7.             Content = new StringContent("Employee doesn't exist", System.Text.Encoding.UTF8, "text/plain"), 
  8.             StatusCode = HttpStatusCode.NotFound 
  9.         } 
  10.         throw new HttpResponseException(response); 
  11.     } 
  12.     return Ok(emp); 

从上面的代码可以看出,错误码 和 错误消息 都赋给了 Response 对象,然后包装到了 HttpResponseException 进行返回。

WebAPI 中使用 HttpError

除了直接实例化 HttpResponseMessage 类,还可以使用 Request.CreateErrorResponse() 快捷的创建 HttpResponseMessage 类,如下代码所示:

  1. public IActionResult GetEmployee(int id) 
  2.     Employee emp = employeeRepository.Get(id); 
  3.     if (emp == null
  4.     { 
  5.        string message = "Employee doesn't exist"
  6.         throw new HttpResponseException( 
  7.             Request.CreateErrorResponse(HttpStatusCode.NotFound, message)); 
  8.     } 
  9.     return Ok(emp); 

WebAPI 中使用 异常过滤器

异常过滤器是一种可以在 WebAPI 中捕获那些未得到处理的异常的过滤器,要想创建异常过滤器,你需要实现 IExceptionFilter 接口,不过这种方式比较麻烦,更快捷的方法是直接继承 ExceptionFilterAttribute 并重写里面的 OnException() 方法即可,这是因为 ExceptionFilterAttribute 类本身就实现了 IExceptionFilter 接口,如下代码所示:

  1. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
  2.    public abstract class ExceptionFilterAttribute : FilterAttribute, IExceptionFilter, IFilter 
  3.    { 
  4.  
  5.        protected ExceptionFilterAttribute(); 
  6.  
  7.        public virtual void OnException(HttpActionExecutedContext actionExecutedContext); 
  8.        public virtual Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken); 
  9.    } 

下面的代码片段展示了如何通过重写 ExceptionFilterAttribute.OnException() 方法来创建一个自定义异常过滤器,请注意下面的代码是如何捕获在 Action 中抛出的异常,并将捕获到的异常转换为 HttpStatusResponse 实体,然后塞入合适的 httpcode 和 httpmessage,如下代码所示:

  1. public class CustomExceptionFilter : ExceptionFilterAttribute 
  2.  { 
  3.      public override void OnException(HttpActionExecutedContext actionExecutedContext) 
  4.      { 
  5.          HttpStatusCode status = HttpStatusCode.InternalServerError; 
  6.          String message = String.Empty; 
  7.          var exceptionType = actionExecutedContext.Exception.GetType(); 
  8.          if (exceptionType == typeof(UnauthorizedAccessException)) 
  9.          { 
  10.              message = "Access to the Web API is not authorized."
  11.              status = HttpStatusCode.Unauthorized; 
  12.          } 
  13.          else if (exceptionType == typeof(DivideByZeroException)) 
  14.          { 
  15.              message = "Internal Server Error."
  16.              status = HttpStatusCode.InternalServerError; 
  17.          } 
  18.          else 
  19.          { 
  20.              message = "Not found."
  21.              status = HttpStatusCode.NotFound; 
  22.          } 
  23.          actionExecutedContext.Response = new HttpResponseMessage() 
  24.          { 
  25.              Content = new StringContent(message, System.Text.Encoding.UTF8, "text/plain"), 
  26.              StatusCode = status 
  27.          }; 
  28.          base.OnException(actionExecutedContext); 
  29.      } 
  30.  } 

接下来将自定义的异常过滤器添加到 HttpConfiguration 全局集合中,如下代码所示:

  1. public static void Register(HttpConfiguration config) 
  2.         { 
  3.             config.MapHttpAttributeRoutes(); 
  4.             config.Routes.MapHttpRoute( 
  5.                 name"DefaultApi"
  6.                 routeTemplate: "api/{controller}/{id}"
  7.                 defaults: new { id = RouteParameter.Optional } 
  8.             ); 
  9.             config.Formatters.Remove(config.Formatters.XmlFormatter); 
  10.             config.Filters.Add(new CustomExceptionFilter()); 
  11.         } 

除了将自定义异常设置到全局上,你还可以缩小粒度到 Controller 或者 Action 级别上,下面的代码分别展示了如何将其控制在 Action 和 Controller 上。

  1. [DatabaseExceptionFilter] 
  2. public class EmployeesController : ApiController 
  3.     //Some code 
  4.  
  5.  [CustomExceptionFilter] 
  6.  public IEnumerable Get() 
  7.  { 
  8.     throw new DivideByZeroException();  
  9.  } 

ASP.NET Web API 提供了强大的 HttpResponseException 来包装异常信息,默认情况下,当 WebAPI 中抛出异常,系统默认使用 Http StateCode = 500 作为回应,也即:Internal Server Error. ,场景就来了,如果你会用 HttpResponseException 的话,就可以改变这种系统默认行为,自定义错误码和错误信息让结果更加清晰语义化。

译文链接:https://www.infoworld.com/article/2994111/how-to-handle-errors-in-aspnet-web-api.html

 

来源:码农读书内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯