Java Spring-boot微服务异常处理

问题描述 投票:2回答:2

Java异常处理分为错误,已检查的异常和未检查的异常。这个问题是关于例外的。

普通的Java异常处理是为检查的异常扩展Exception类,并通过考虑异常层次结构来处理所需的异常。

例如:

public class ExceptionA extends Exception {}

public class RunClass {

    public static void main() {
        try {
            RunClass runClass = new RunClass();
            runClass.doSomething();
        } catch(ExceptionA eA) {
            // Do ExceptionA related resolutions.
        } catch(Exception e) {
            // Do Exception related resolutions.
        }
    }

    public doSomething() throws ExceptionA {
        throw new ExceptionA();
    }
}

但是我看到了主要的Spring书籍,甚至在Spring-boot提到的Internet教程上,而且在微服务的上下文中,即使使用@ControllerAdvice,也总是从RuntimeException类扩展过来的。

这显然违反了Java异常处理基础。但是仍然有一个说法,它是通过RuntimeException扩展的,因为此异常是由@ExceptionHandler方法处理的,并且它是在运行时生成和处理的。

仍然,由于RuntimeException的此扩展,使得编译时异常处理线索不可见,并且难以追溯引发异常的方式。由于这些原因,我仍然相信,仍然使用@ExceptionHandler方法遵循基本的Java已检查和未检查的异常处理概念。

例如:

public class ExceptionRA extends RuntimeException {}

@ContollerAdvice
public class ExceptionHandler {

    @ExceptionHandler(ExceptionRA.class)
    public String handleException (Exception exception, Model model) {
        return "exception";
    }

}

@Controller
public class RunClass {

    @RequestMapping("/url1")
    public doSomething() {
        throw new ExceptionRA();
    }
}

我应该使用@ExcpetionHadler遵循所有异常情况的扩展RuntimeException,还是使用@ExceptionHaldler遵循基本的Java检查和未检查机制?欢迎提出想法,建议和更正。

java spring-mvc spring-boot microservices netflix
2个回答
5
投票

对已检查/未检查的异常的偏好就像一种宗教。

您通常不会在自己的代码中调用控制器方法。通常,您不会有以下代码:

try {
   runClass.doSomething();
} catch(ExceptionRA exra) {
  // Handle handle handle
}

因此,您将不会直接从controller方法抛出的检查异常中获利。他们不会强制执行任何已检查的处理,因为没有地方可以处理它们。因此,您也可以抛出未检查的异常并使方法签名更短。从控制器方法中抛出已检查的异常没有任何附加价值。

控制器正在调用的某些业务服务方法也可能引发异常。这引起了两个问题:

  • 您应该在业务逻辑中使用检查或未检查的异常吗?
  • 如果业务逻辑引发检查异常,是否应将其包装为未检查异常?还是只是通过?

第一个问题的答案是-您不应让此决定受您在控制器中所做的影响。根据您的“例外宗教”来做。如果您更喜欢检查异常,请使用检查异常,无论您是否要在控制器中使用未检查异常。

否,第二个问题。假设您的业务逻辑引发了一个已检查的异常。如果此异常足以向调用者表示情况,则没有理由将其包装到其他任何异常中,无论它是选中的还是未选中的。如果您的业务异常无法正确地向呼叫者解释这种情况,则最好将其包装。然后,未经检查的异常将使您的签名更短。

现在有个人意见。对于除编程错误之外的所有内容,我通常都喜欢检查异常。我也在控制器中使用它们(不要介意有些冗长的方法签名)。


0
投票
   @ControllerAdvice
    public class ExceptionController {

        @ExceptionHandler(NotFoundException.class)
        public ResponseEntity<List<ErrorDto>> handleNotFoundException(NotFoundException e){
            final String message = "The provided id is not in DB" + e.getMessage() + " " + "not found";
            final List<ErrorDto> errorDto = new ArrayList<>();
            errorDto.add(new ErrorDto("400", message, e.getField()));
            return new ResponseEntity<>(errorDto, HttpStatus.BAD_REQUEST);

        }

================================================ ===================================

@Data
public class ErrorDto {
    private String code;
    private String message;
    private String field;

}

================================================ ===================================

供参考使用,以下链接:(逐步说明)

https://www.youtube.com/watch?v=OLt_CiNsu4A&t=27s

© www.soinside.com 2019 - 2024. All rights reserved.