当前位置: 首页 > 知识库问答 >
问题:

spring boot中的生产级异常处理

韶景曜
2023-03-14

我有一个场景:

            UI<--->Spring boot micro-service REST API<--->server

现在,有一种情况,我想处理自定义异常(我知道如何做),以便在服务器以某种方式响应时将特定的Http状态和消息返回到UI,例如,500应返回“请稍后返回”,而不是“内部服务器错误”。我们微服务的maven项目分为3层(子maven项目),即业务、Web和域。其中web包含控制器类,业务包含服务类,域包含@Entity、@Components等。

我想知道为了处理上面提到的异常,比如说HTTP状态500,应该在业务层完成吗?或在web层,即控制器级别。最好的解决方案是什么?(我知道ResponseEntity以及它如何为UI提供定制响应)。

我个人认为,如果我在业务级别包含自定义异常类,并在检查响应状态后使用响应实体在控制器类中返回该异常类,那么就可以了。但官员们觉得应该在服务水平上进行?我不明白为什么(这会使过程更加复杂)?谁能建议哪种解决方案最好?

共有3个答案

羊新翰
2023-03-14

错误响应通常由与您的异常类型匹配的@ExceptionHandler生成,并可能注册到@ConrtrollerAdvice,如下所述。

API应标准化(例如:。http://jsonapi.org/)而且主要是为开发者设计的。返回“请稍后返回”而不是“内部服务器错误”,对我来说没有什么意义。这是一个不确定原因的500 HTTP状态响应,例如NullPointerException代码深处的某个地方。

明利
2023-03-14

如果您想在全局级别处理错误,可以使用@ControllerAdvice,这在处理自定义异常和运行时异常时非常容易。

您可以将异常从业务层抛出到web控制器,并定义@ControllerAdvice类来捕获这些错误,并提供具有正确响应状态的响应。

对于Ex:-

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(value = { IllegalArgumentException.class, IllegalStateException.class })
    protected ResponseEntity<Object> handleConflict(RuntimeException ex, WebRequest request) {
        String bodyOfResponse = "This should be application specific";
        return handleExceptionInternal(ex, bodyOfResponse, 
          new HttpHeaders(), HttpStatus.CONFLICT, request);
    }
}

并且从控制器类中抛出这些异常类,你不需要从控制器中捕获异常。

希望这对你有帮助...

上面的代码片段

燕扬
2023-03-14

官员们是对的,应该在服务层。我认为最好的做法是使用@ExceptionHandler。因为在控制器方法中处理异常的缺点是,它会降低代码的可读性,并且可能会在许多控制器方法中重复。

我建议为控制器创建一个定义了@ExceptionHandler的基类。这样,它可以用于许多不同的控制器,而无需任何代码复制。这将比异常解析器方法更具可读性,但可以结合使用,这里对此进行了清楚的解释

 类似资料:
  • 我有一个循环缓冲区(数组/先进先出),一个消费者和一个生产者。生产者将随机数放入数组中,消费者获取第一个数字并检查它是否是相对素数。 我的代码工作正常,我认为它工作正常,但我想改进它。我不太确定我的“空运行”方法。我应该在其他地方做异常处理吗?改变“无限循环”?不应更改方法签名(它们是预定义的)。 我会很高兴每一个改进代码的建议。(不在乎知名度(公开,...),还有静态的东西,我刚刚把它们放在一个

  • 本文向大家介绍springboot全局异常处理详解,包括了springboot全局异常处理详解的使用技巧和注意事项,需要的朋友参考一下 一、单个controller范围的异常处理 说明: 在controller中加入被@ExceptionHandler修饰的类即可(在该注解中指定该方法需要处理的那些异常类) 该异常处理方法只在当前的controller中起作用 二、全部controller范围内起

  • 我有一个spring-boot应用程序,没有任何控制器类。如何为该应用程序编写异常处理程序。用@ControllerAdvice注释的异常处理程序类不起作用。

  • 问题内容: 我有一个生成器和一个使用它的函数: 如果生成器引发异常,我想在使用者函数中处理该异常,然后继续使用迭代器,直到耗尽为止。请注意,我不想在生成器中有任何异常处理代码。 我想到了类似的东西: 但这对我来说看起来很尴尬。 问题答案: 这也是我不确定是否正确/优雅处理的事情。 我要做的是从生成器中获取一个,然后将其提升到其他位置。喜欢: 这样,我仍然继承了Exception而没有引发它,这将导

  • 本文向大家介绍springboot全局异常处理代码实例,包括了springboot全局异常处理代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了springboot全局异常处理代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言: 开发中异常的处理必不可少,常用的就是 throw 和 try catch,这样一个项目到最

  • 本文向大家介绍SpringBoot使用统一异常处理详解,包括了SpringBoot使用统一异常处理详解的使用技巧和注意事项,需要的朋友参考一下 场景:针对异常处理,我们原来的做法是一般在最外层捕获异常即可,例如在Controller中 这样的话也能解决部分问题,但是无法获取到自己指定的异常,引入全局统一异常处理的话将会极大的改善代码,减少冗余代码的产生。 自定义异常类:注意要继承自RuntimeE