- 概述
在应用程序设计中,异常处理一直是一个很重要的话题。当应用程序发生异常时,它可能停止工作,或者转变成一个不可预期的状态,从而影响到用户的体验。因此,为了保证系统的可用性、可维护性和可扩展性,我们肯定需要处理异常。SpringBoot提供了一种统一的异常处理方式,能够快速捕获并处理所有异常情况,这也是SpringBoot越来越受欢迎的原因之一。
- 实现
实现SpringBoot统一异常处理需要完成以下步骤:
2.1 自定义异常类
在这一步中,我们需要定义自己的异常类。继承Exception或RuntimeException类即可。
public class ApplicationException extends RuntimeException {
public ApplicationException(String message) {
super(message);
}
}
2.2 异常处理类
接下来我们需要定义全局的异常处理类。在这个类中,我们需要加上注解@RestControllerAdvice
,并且定义处理异常的方法。在方法中,我们先判断异常类型,然后根据异常类型返回错误信息即可。
@RestControllerAdvice
public class GlobalExceptionController {
@ExceptionHandler(value = ApplicationException.class)
public ResponseEntity<String> handleApplicationException(ApplicationException e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
@ExceptionHandler(value = Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
在上面的代码中,@ExceptionHandler
注解是用来处理异常的,参数是异常的类型。ResponseEntity
是Spring框架的一个类,用来表示HTTP状态码以及返回的内容。如果要返回一个自定义的对象,我们可以把泛型设置成自定义的对象类型。
2.3 使用异常类
在代码中,当我们需要抛出异常时,只需要实例化刚才定义的异常类即可。
@GetMapping("/test")
public void test() {
throw new ApplicationException("test exception");
}
如果在控制器中都有很多这样的异常,我们可以在代码中把异常抛到调用层,然后在调用层捕获异常并处理。
- 示例
以下是两个示例的代码:
示例1:数据格式不正确
public class ErrorMessage {
private String message;
public ErrorMessage(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
@RestControllerAdvice
public class GlobalExceptionController {
@ExceptionHandler(value = {IllegalArgumentException.class, IllegalStateException.class})
public ResponseEntity<ErrorMessage> handleIllegalStateException(Exception e) {
ErrorMessage errorMessage = new ErrorMessage(e.getMessage());
return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST);
}
}
@GetMapping("/test")
public ResponseEntity<String> test(@RequestParam(name = "id") int id) {
if (id <= 0) {
throw new IllegalArgumentException("id is invalid");
}
return new ResponseEntity<>("test success", HttpStatus.OK);
}
当我们访问这个API时,输入的id如果小于等于0则会返回错误信息:
{
"message": "id is invalid"
}
示例2:处理未知异常
@RestControllerAdvice
public class GlobalExceptionController {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<ErrorMessage> handleException(Exception e) {
ErrorMessage errorMessage = new ErrorMessage("unknown error");
return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@GetMapping("/test")
public ResponseEntity<String> test() {
int x = 1 / 0; // 引发异常
return new ResponseEntity<>("test success", HttpStatus.OK);
}
当我们访问这个API时,代码会引发异常并返回错误信息:
{
"message": "unknown error"
}
- 总结
通过自定义异常类和全局异常处理类,我们成功实现了SpringBoot的统一异常处理。这种方式可以让我们快速捕获并处理所有异常情况,从而提高应用程序的可用性和可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot接口如何统一异常处理 - Python技术站