作者回复: 初步网上查了一下,一种统一处理feign接口异常的方法是:用RestControllerAdvice集中捕获和处理FeignException 参考: https://stackoverflow.com/questions/55020389/spring-feign-client-exception-handling https://www.javacodemonk.com/feign-exception-handling-spring-cloud-20d17f69 异常一般可以分为两类: 1. 底层http通讯异常,比如连不上或超时等 2. 服务端返回http错误码异常。 具体要根据应用场景分析。
作者回复: 你好,统一异常处理属于微服务治理的重要环节,不管公司规模大小,并发量多大,都要做。我之前在eBay这种大厂工作过,它的交易量非常大,但它的框架层和业务层错误处理做得非常细致,反倒是一些中小公司常常忽略异常处理。异常处理发生时的确有一定的性能损耗,但是这个是必须的,而且生产级代码是建议尽可能细致全面的做错误处理,目前没有证据显示,细粒度的错误处理会引发性能问题。另外,很多大厂的服务框架都有统一异常处理逻辑,统一异常处理有利于规范和后续的运维。
作者回复: 我之前设计框架的时候,一般只设计两类异常,一类是框架异常(或者你说的系统异常),另一类是业务异常(业务开发自己定制扩展)。 异常种类不需要太多,但是错误码(error code)和错误消息(error message)可以按需定义。你提到的回滚操作可以根据错误码判断。
作者回复: 这个取决于Controller方法会不会抛异常。我简单查了一下: https://stackoverflow.com/questions/22003011/spring-mvc-validation-exceptionhandler-invoked-before-controller-method 如果Controller方法中不带BindingResult参数,那么验证失败就会抛出异常,抛出异常的话ErrorController可以统一捕获。 如果Controller方法中带BindingResult参数,那么就不会抛异常,当然ErrorController也就捕获不到。 具体可以做个简单例子尝试一下。
作者回复: 是的,谢谢提醒!
作者回复: 微服务层统一异常处理可以做到,可参考我的案例代码,可以做得粒度较细,也可以比较粗,具体看业务需要。
作者回复: 课程的重点是微服务和云原生架构,微服务/云原生架构和具体前端(vue/reactjs/angularjs)无关,课程以reactjs为例只是演示。
作者回复: 你好,因为Staffjoy是一个简单教学案例,所以: 1. 服务层的异常统一包装成ServiceException,里头有error code和message等关键信息就够了,暂时也没有必要再继承。 2. 继承RuntimeException就不用麻烦手动捕获,可以集中让Spring ControllerAdvice异常机制统一捕获。 当然,这个只是我个人做法,对于异常的使用,不同的人有不同的风格,所以你也可以按需采用你自己的风格。
作者回复: 统一异常处理用了Spring的RestControllerAdvice机制(可以网上找下,相关文档很多),相关类GlobalExceptionTranslator在common-lib中,其它Spring应用只要能类扫描到并加载这个GlobalExceptionTranslator,就可以实现统一异常处理。 在其它Spring应用中,框架异常或者你自己定义的异常,向外抛出时,最终会被这个RestControllerAdvice所捕获,并做统一处理。
作者回复: 从你描述我没有看出具体什么问题,可以加我微信(bulldog2015,说明来自极客时间),进一步了解细节。