新增功能的异常捕获
问题
在实现新增功能后,遇到了一个问题。当用户尝试添加新员工时,如果输入的账号已经存在,由于在employee表中对该字段添加了唯一约束,程序会抛出异常。java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'zhangsan' for key 'idx_username'
异常。
解决
程序需要进行异常捕获,通常有两种处理方式:
-
在Controller方法中加入try-catch进行异常捕获
try{ employeeService.save(employee); }catch(Exception ex){ R.error("员工已存在"); } return R.success("新增员工成功")
-
使用异常处理器进行全局异常捕获
-
使用全局异常处理器的好处,在于:
未捕获异常的处理: 全局异常处理器能够捕获整个程序执行过程中未被显式捕获的异常,防止程序因未捕获异常而终止。这有助于保持程序的稳定性和可靠性。
异常信息记录和报告: 通过全局异常处理器,你可以在捕获异常时记录相关信息,例如异常类型、发生异常的位置等,从而更容易追踪和调试问题。这对于诊断和解决潜在的问题非常有帮助。
统一的异常处理逻辑: 全局异常处理器允许你在一个地方集中处理所有的未捕获异常,从而实现统一的异常处理逻辑。这可以包括日志记录、错误报告、用户通知等,有助于代码的维护和管理。
-
下面是异常处理器进行全局异常捕获的示例。
@ResponseBody @Slf4j @ControllerAdvice(annotations = {RestController.class, Controller.class}) //拦截RestController和Controller public class GlobalExceptionHandler { /** * 异常处理方法 * @param ex * @return */ @ExceptionHandler(SQLIntegrityConstraintViolationException.class) public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){ log.error(ex.getMessage()); if(ex.getMessage().contains("Duplicate entry")){ String[] split = ex.getMessage().split(" "); String msg = split[2] + "已存在"; return R.error(msg); } return R.error("未知错误"); } }
这段代码是一个基于Spring框架的全局异常处理器,该异常通常在数据库操作中违反唯一性约束时抛出。以下是这段代码实现的主要功能过程:
- 记录异常信息: 通过
log.error(ex.getMessage())
将异常信息记录到日志中,以便进行调试和监控。 - 判断异常原因: 使用
ex.getMessage().contains("Duplicate entry")
来判断异常消息中是否包含 “Duplicate entry”,这是通常表示唯一性约束违反的关键字。 - 构造错误信息: 如果异常是由于唯一性约束违反导致的,就从异常消息中提取出重复的值,并构造一个错误信息,表示该值已存在。
- 返回响应: 使用自定义的
R
类型进行包装错误信息,并通过R.error(msg)
返回给客户端。如果异常原因无法确定,返回一个通用的错误信息 “未知错误”。 - 另外,
@ResponseBody
注解: 该注解指示 Spring MVC 框架将方法的返回值直接作为 HTTP 响应体写入到响应中。@ControllerAdvice
注解: 该注解标记了一个类作为全局控制器的通知类。通过annotations
属性指定了要拦截的控制器注解,这里包括RestController.class
和Controller.class
,表示拦截所有标记有这两个注解的控制器。@ExceptionHandler(SQLIntegrityConstraintViolationException.class)
注解: 该注解标记了一个方法,用于处理SQLIntegrityConstraintViolationException
异常。当控制器中抛出该异常时,Spring会调用这个方法进行处理。
- 记录异常信息: 通过
-
需要注意的是,全局异常处理器并不应该成为处理所有异常的首选方式。在实际的开发中,最好是在代码中明确处理已知的异常,而将全局异常处理作为一个备用的机制,用于捕获和处理未被显式捕获的异常。
-