springmvc SQL 异常 ExceptionHandler 无法捕捉
时间: 2024-02-02 12:05:19 浏览: 70
12SpringMVC异常处理.md
Spring MVC中的异常处理器`@ExceptionHandler`只能处理Controller层抛出的异常,而无法捕捉到DAO或Service层抛出的异常。
如果需要在DAO或Service层捕捉到SQL异常,并统一处理,可以采用以下两种方式:
1. 利用AOP拦截异常
可以使用Spring AOP拦截DAO或Service层的方法,在方法执行时捕捉异常,并进行统一处理。例如:
```java
@Aspect
@Component
public class ExceptionAspect {
@Autowired
private HttpServletResponse response;
@Around("execution(* com.example.dao.*.*(..)) || execution(* com.example.service.*.*(..))")
public Object handleException(ProceedingJoinPoint point) throws Throwable {
try {
return point.proceed();
} catch (SQLException e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "SQL Exception");
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Unknown Exception");
}
return null;
}
}
```
2. 自定义异常并抛出
在DAO或Service层方法中捕捉到SQL异常后,可以将该异常包装成一个自定义异常,并抛出,然后在Controller层通过`@ExceptionHandler`捕捉到该自定义异常并进行统一处理。例如:
```java
// DAO或Service层中的方法
public void save(User user) throws SQLException, CustomException {
try {
// 执行SQL操作
} catch (SQLException e) {
throw new CustomException("SQL Exception", e);
}
}
// Controller层中的方法
@PostMapping("/user")
public void saveUser(@RequestBody User user) throws CustomException {
userService.save(user);
}
@ExceptionHandler(CustomException.class)
public void handleCustomException(HttpServletResponse response, CustomException e) throws IOException {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
```
通过以上两种方式,可以在DAO或Service层捕捉到SQL异常并进行统一处理。
阅读全文