在Spring Boot中实现全局异常处理可以通过以下方式:
- 使用
@ControllerAdvice
注释创建一个全局异常处理类,并使用@ExceptionHandler
注释来定义具体异常的处理方法。
import your.package.IllegalNumberException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @class GlobalExceptionHeadler
* @date 2021/8/28 13:41
*/
@ControllerAdvice
public class GlobalExceptionHeadler {
//处理指定异常
@ExceptionHandler(value = IllegalNumberException.class)//IllegalNumberException 自定义异常
@ResponseBody
public ResponseEntity<String> illegalNumberExceptionHeadler(Exception e){
System.out.println("进入非法参数异常处理");
return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
}
//处理exceptioin子类异常
@ExceptionHandler(value = Exception.class)//作用方法上,作用:用来处理指定异常; value属性:用来处理指定类型的异常
@ResponseBody
public ResponseEntity<String> exceptionHeadler(Exception e){
//if(e instanceof IllegalNumberException){} 等价于 上面的方法处理指定异常
System.out.println("进入自定义异常处理");
return new ResponseEntity<>(e.getMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
}
}
- 自定义异常
/**
* @class IllegalNumberException
* @date 2021/8/28 14:05
*/
public class IllegalNumberException extends RuntimeException{
public IllegalNumberException(String message){
super(message);
}
}
- Controller
import your.package.IllegalNumberException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class Test2Controller {
@GetMapping("/testException")
public ResponseEntity<String> demo(){
int i = 1/0;
return new ResponseEntity<>("ok", HttpStatus.OK);
}
@GetMapping("/testIllegalNumberException/{id}")
public ResponseEntity<String> demo(@PathVariable("id") Integer id){
if(id < 0){
throw new IllegalNumberException("无效id,请检查");
}
return new ResponseEntity<>("ok", HttpStatus.OK);
}
}
- Postman测试效果
通用异常:
自定义异常:
5. 总结
在以上代码片段中,使用了 @ExceptionHandler
注解来指定该方法会处理哪种类型的异常。方法体中,你可以自定义返回给用户的响应,包括HTTP状态码和返回信息。使用 @ControllerAdvice
注解可以确保它会接收到由控制器抛出的异常。
如果需要更多具体的自定义设置,还可以在响应里添加 headers 信息,或者创建更复杂的响应体,例如使用ResponseEntity
。官方的 Spring 框架文档提供了和这个主题相关的更多高级选项和最佳实践指南。