在Spring Boot中,异常处理是通过统一的方式来捕获和处理应用程序中抛出的异常,以提高系统的可靠性和用户体验。以下是在Spring Boot中常见的异常处理方法:
1. 全局异常处理器
Spring Boot允许定义一个全局的异常处理器,它可以捕获应用程序中未被其他处理器捕获的所有异常。通常使用 @ControllerAdvice
注解和 @ExceptionHandler
注解来实现。
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 处理异常,返回合适的响应信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("An error occurred: " + ex.getMessage()); } // 可以定义其他特定异常的处理方法 }
2. 控制器层异常处理
在具体的控制器中,也可以定义特定类型的异常处理方法,用于捕获和处理该控制器中抛出的异常。
@RestController @RequestMapping("/api") public class MyController { @GetMapping("/resource") public ResponseEntity<String> getResource() { if (someCondition) { throw new CustomException("Resource not found"); } return ResponseEntity.ok("Resource found"); } @ExceptionHandler(CustomException.class) public ResponseEntity<String> handleCustomException(CustomException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body("Resource not found: " + ex.getMessage()); } }
3. 自定义异常类
为了更好地管理和区分不同的异常情况,可以定义自定义的异常类,并在需要时抛出这些异常。
public class CustomException extends RuntimeException { public CustomException(String message) { super(message); } }
4. ResponseEntity与异常处理
异常处理方法通常会返回 ResponseEntity
对象,这样可以更灵活地定义响应的状态码、消息体和头部信息。
@ExceptionHandler(CustomException.class) public ResponseEntity<String> handleCustomException(CustomException ex) { return ResponseEntity.status(HttpStatus.NOT_FOUND) .body("Resource not found: " + ex.getMessage()); }
5. 异常处理的最佳实践
- 精细化处理:根据具体的业务需求和异常情况,合理地划分和定义异常处理器,提高代码的可读性和维护性。
- 统一错误响应:确保异常处理器返回的响应符合统一的错误响应格式,以便客户端能够方便地处理错误情况。
- 日志记录:在异常处理器中记录相关的异常信息和上下文,以便进行问题排查和系统监控。
Spring Boot的异常处理机制非常灵活,可以根据具体的项目需求进行定制化,保证系统在面对异常情况时能够稳定运行并提供良好的用户体验。
异常消息处理
我们当前的增删改查基本完成
我们当前的情况是在理想状态下完成的
但是实际开发中我们要抛出异常
业务在进行处理的时候
数据格式就是这样
前端拿到的信息我们应该去处理
前端如何去处理得去斟酌
即使前端出现了异常
我们也要让返回的异常信息让前端成功读取
我们有一个异常处理器
Spring MVC 属于 controller 层的技术
放这里就行
定义全新的数据访问格式
package com.bigdata1421.ssmp.controller.utils; import lombok.Data; @Data public class Result { private Boolean flag; private Object data; private String msg; public Result(Boolean flag){ this.flag=flag; } public Result(Boolean flag,Object data){ this.flag=flag; this.data=data; } public Result(Boolean flag,String msg){ this.flag=flag; this.msg=msg; } }
也可以这样改写
异常处理类
package com.bigdata1421.ssmp.controller.utils; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestControllerAdvice; //作为 spring mvc 的异常处理器 @RestControllerAdvice public class ProjectExceptionAdvice { @ExceptionHandler public Result doException(Exception ex){ //记录日志 //通知运维 //通知开发 ex.printStackTrace(); return new Result( "服务器故障,请稍后重试"); } }
Result类
package com.bigdata1421.ssmp.controller.utils; import lombok.Data; @Data public class Result { private Boolean flag; private Object data; private String msg; public Result(Boolean flag){ this.flag=flag; } public Result(Boolean flag,Object data){ this.flag=flag; this.data=data; } public Result(String msg){ this.flag=false; this.msg=msg; } }
这样就能拿到报错信息
//修改 handleEdit() { //与添加功能绑定的是一个数据模型 //绑定的是确定按钮 发起请求 axios.put("/users", this.formData).then((res) => { //判断当前操作是否成功 if (res.data.flag) { //关闭弹层 this.cancel(); this.$message.success("人员数据修改成功"); }else { this.$message.error(res.data.msg); } }).finally(()=>{ //重新加载页面 this.getAll(); }); },
空体判断
抛出异常给Spring mvc的异常消息处理机制
但是这样我们的代码有的是在前端页面中写的
有的是在服务器的三层架构里写的 这样不好
这样不好
先是异常处理
之后是代码核心逻辑处理
判断flag是否为ture 还是false 添加成功
进阶版
页面消息处理
没有传递消息加载默认消息
传递消息后加载指定消息
我们后端和前端都要进行处理
我们主要是在表现层Controller中进行消息统一处理
目的是国际化
让异常处理的时候交给后端统一处理
这样前端就能简化书写
小结