首页 > 社交 > 科普中国

基于SpringBoot微服务开发中的异常处理最佳实践

常驻编辑 科普中国 2022-05-30 异常   字段   路径   模块   接口   定义   状态   错误   消息   业务
方法的实现,在一个产品中,为与其他子业务模块区分,我们在不同的业务模块中,使用特定的模块名称作为错误码前缀。另外一个主要注意的就是如上代码注释中提及的,在业务模块中错误码定义是采用 宽泛化 还是 特定化 模式,这个因人而异,在本实践中,我们更倾向于使用 宽泛化 的模式。P0z拜客生活常识网

RestExceptionHandler 就本示例代码中,就只是一个 CustomizedBaseExceptionHandler 的空子类了。P0z拜客生活常识网

@ControllerAdvice
@RestController
public class RestExceptionHandler extends CustomizedBaseExceptionHandler {
}

如果要为某个特定的异常添加处理逻辑,可以在该处理器类中实现,实现方式请参考 ResponseEntityExceptionHandlerCustomizedBaseExceptionHandlerP0z拜客生活常识网

关于该业务模块,还有最后两点值得一提,那就是对于『Not Found』和 『参数校验』的处理方式。P0z拜客生活常识网

『Not Found』,在 RESTful 风格的 API 中是一个很值得推敲的技巧点。在 RFC 规范定义了 HTTP 404 这个响应状态码,用于描述 "Not Found" 错误。在以模板视图为返回内容的 Web MVC 中,该状态码表示访问的视图资源未找到,说明访问路径有误。而在以无状态的资源未返回内容的接口风格中,除了访问路径有误这一种原因外,还可能路径虽然没有问题,但资源在服务器上不存在了。P0z拜客生活常识网

比如 GET/books/1 或者 PUT/books/1 以及 /books/foobar 虽然从形式上来看,这三种也都勉强可以归类为路径不存在,但其实前两者和第三个的本质上是不同的,前两者匹配的是路径 /books/{id},这里只是代表 id 为 1 的资源在服务器上不存在了,而 /books/foobar 则是在服务器上根本未定义这样的一个资源路径。P0z拜客生活常识网

对于这种情况,我们认为一个好的处理方式是,把第三种当做 HTTP 404 处理,即客户端访问了错误的资源路径,而把路径模式正确而资源可能因为已删除或未添加等原因导致的资源未找到,对应到 HTTP 400 状态码上,认为是客户端只是请求参数有问题,以至于请求到了不存在的资源。Spring WebMVC 默认会把未定义 RequestMapping 的路径使用默认的映射器处理器处理,把它当做是对静态资源的请求,从而给出一个 404 的错误响应状态。我们在 application.properties 中通过设置 spring.mvc.throw-exception-if-no-handler-found=truespring.resources.add-mappings=false

相关阅读:

  • 为什么打开时油烟机里面会响
  • 电脑cpu温度多少正常(笔记本cpu异常高温怎么解决)
  • 异常有哪些(异常感染)
  • 手机dns在哪里设置(手机dns异常上不了网)
  • 鸡蛋是修复肝脏的“加速剂”?提醒:5种食物皆有助于肝脏
  • java获取真实ip及真实地址工具类
  • 怀孕多久去医院检查最好?
  • 如果你也出现这些睡眠障碍,那么你就要注意了
  • “华为”出现黑块,“柔软屏”很柔软?
  • 肝不好的时候,手和手指甲会有什么提示?中医养肝护肝的五
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。