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

本文转载自微信公众号「码农读书」,何友好作者码农读书。处理出的错误转载本文请联系码农读书公众号。中抛
微软的何友好 ASP.NET Web API 是一个轻量级的web框架,可用来构建基于 http 无状态的处理出的错误rest服务,异常是中抛一种运行时错误,异常处理是何友好一种处理运行时错误的技术,每一个开发者都应该知道如何处理 Web API 中的处理出的错误异常,并且在 Action 中使用合适的中抛 错误码 和 错误信息 进行包装。
WebAPI 中的何友好 HttpResponseException
你可以在 Action 中使用 HttpResponseException 来包装指定的 HttpCode 和 HttpMessage,如下例子所示:
public Employee GetEmployee(int id) { Employee emp = employeeRepository.Get(id); if (emp == null) { var response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Employee doesnt exist",处理出的错误 System.Text.Encoding.UTF8, "text/plain"), StatusCode = HttpStatusCode.NotFound } throw new HttpResponseException(response); } return emp; }如果你的 Action 返回的WordPress模板是 IHttpActionResult,那么可将 GetEmployee() 方法修改如下:
public IHttpActionResult GetEmployee(int id) { Employee emp = employeeRepository.Get(id); if (emp == null) { var response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Employee doesnt exist",中抛 System.Text.Encoding.UTF8, "text/plain"), StatusCode = HttpStatusCode.NotFound } throw new HttpResponseException(response); } return Ok(emp); }从上面的代码可以看出,错误码 和 错误消息 都赋给了 Response 对象,何友好然后包装到了 HttpResponseException 进行返回。处理出的错误
WebAPI 中使用 HttpError
除了直接实例化 HttpResponseMessage 类,中抛还可以使用 Request.CreateErrorResponse() 快捷的创建 HttpResponseMessage 类,如下代码所示:
public IActionResult GetEmployee(int id) { Employee emp = employeeRepository.Get(id); if (emp == null) { string message = "Employee doesnt exist"; throw new HttpResponseException( Request.CreateErrorResponse(HttpStatusCode.NotFound, message)); } return Ok(emp); }WebAPI 中使用 异常过滤器
异常过滤器是一种可以在 WebAPI 中捕获那些未得到处理的异常的过滤器,要想创建异常过滤器,你需要实现 IExceptionFilter 接口,不过这种方式比较麻烦,更快捷的方法是直接继承 ExceptionFilterAttribute 并重写里面的 OnException() 方法即可,这是因为 ExceptionFilterAttribute 类本身就实现了 IExceptionFilter 接口,如下代码所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] public abstract class ExceptionFilterAttribute : FilterAttribute, IExceptionFilter, IFilter { protected ExceptionFilterAttribute(); public virtual void OnException(HttpActionExecutedContext actionExecutedContext); public virtual Task OnExceptionAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken); }下面的代码片段展示了如何通过重写 ExceptionFilterAttribute.OnException() 方法来创建一个自定义异常过滤器,请注意下面的云服务器提供商代码是如何捕获在 Action 中抛出的异常,并将捕获到的异常转换为 HttpStatusResponse 实体,然后塞入合适的 httpcode 和 httpmessage,如下代码所示:
public class CustomExceptionFilter : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionExecutedContext) { HttpStatusCode status = HttpStatusCode.InternalServerError; String message = String.Empty; var exceptionType = actionExecutedContext.Exception.GetType(); if (exceptionType == typeof(UnauthorizedAccessException)) { message = "Access to the Web API is not authorized."; status = HttpStatusCode.Unauthorized; } else if (exceptionType == typeof(DivideByZeroException)) { message = "Internal Server Error."; status = HttpStatusCode.InternalServerError; } else { message = "Not found."; status = HttpStatusCode.NotFound; } actionExecutedContext.Response = new HttpResponseMessage() { Content = new StringContent(message, System.Text.Encoding.UTF8, "text/plain"), StatusCode = status }; base.OnException(actionExecutedContext); } }接下来将自定义的异常过滤器添加到 HttpConfiguration 全局集合中,如下代码所示:
public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Formatters.Remove(config.Formatters.XmlFormatter); config.Filters.Add(new CustomExceptionFilter()); }除了将自定义异常设置到全局上,你还可以缩小粒度到 Controller 或者 Action 级别上,下面的代码分别展示了如何将其控制在 Action 和 Controller 上。
[DatabaseExceptionFilter] public class EmployeesController : ApiController { //Some code } [CustomExceptionFilter] public IEnumerable<string> Get() { throw new DivideByZeroException(); }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
相关文章
电脑关机提示端口错误的原因及解决方法(探究电脑关机时显示端口错误的常见原因和解决办法)
摘要:在使用电脑的过程中,有时候我们会遇到关机时出现端口错误的提示。这种情况让很多用户感到困惑,不知道该如何解决。本文将从常见原因和解决方法两个方面,为大家详细介绍电脑关机提示端口错误的...2025-11-05苹果笔记本游戏体验如何?(以苹果笔记本玩游戏的优势和劣势分析)
摘要:苹果公司的笔记本电脑凭借其出色的性能和用户友好的操作系统,一直以来都备受好评。然而,对于游戏爱好者来说,苹果笔记本是否能够提供与其他竞争对手相当的游戏体验一直是一个争议话题。本文将...2025-11-05以2s手机设置会带来哪些变化?(探索2s手机设置功能的实用性和便利性)
摘要:随着科技的不断进步,手机已经成为我们生活中不可或缺的一部分。而2s手机作为一个新兴品牌,其设置功能给用户带来了许多新的体验。本文将探讨以2s手机设置会带来哪些变化,以及这些设置对我...2025-11-05海信HSEG939手机的性能与用户体验(一部强大的智能手机,让你体验无限可能)
摘要:在如今的移动互联网时代,智能手机已成为人们生活中不可或缺的一部分。作为一款备受瞩目的新品,海信HSEG939以其出色的性能和用户体验,引起了广大消费者的关注。本文将围绕这款手机展开...2025-11-05- 摘要:在现代社会中,电脑已经成为我们生活和工作中不可或缺的一部分。而键盘作为电脑的重要输入设备,我们每天都要与之亲密接触。然而,很多人在使用笔记本电脑键盘时常常感到困惑,甚至影响到了打字...2025-11-05
- 摘要:空气是人类生存不可或缺的元素之一,而新鲜的空气更是对人体健康和心情有着积极的影响。无论是在自然环境中还是在室内,呼吸新鲜空气都是保持身心健康的重要因素。本文将探讨以新鲜的空气为基础...2025-11-05

最新评论