Spring Boot的@ExceptionHandler
注解用于处理控制器类中抛出的特定异常。然而,当异常在@Aspect
切面类中抛出时,@ExceptionHandler
可能无法捕获这些异常,这是因为切面类中的异常处理机制与控制器类中的异常处理机制是分开的。
@ExceptionHandler
无法捕获@Aspect
中的异常?@ExceptionHandler
注解的方法只能在同一个控制器类中捕获异常,而@Aspect
中的异常是在不同的作用域中抛出的。@ExceptionHandler
捕获,因为它超出了控制器的执行上下文。可以在切面中使用try-catch
块来捕获并处理异常。
@Aspect
@Component
public class LoggingAspect {
@Around("execution(* com.example.demo.service.*.*(..))")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
try {
long start = System.currentTimeMillis();
Object proceed = joinPoint.proceed();
long executionTime = System.currentTimeMillis() - start;
System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms");
return proceed;
} catch (Exception e) {
// 处理异常
System.err.println("Exception in method: " + joinPoint.getSignature() + " Exception: " + e.getMessage());
throw e; // 可以选择重新抛出异常
}
}
}
使用@ControllerAdvice
和@ExceptionHandler
创建一个全局异常处理器,它可以捕获整个应用程序中的异常,包括切面中抛出的异常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
return new ResponseEntity<>("An error occurred: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
Spring Boot提供了默认的错误处理页面和错误处理机制,可以通过配置application.properties
或自定义错误页面来处理未捕获的异常。
# application.properties
server.error.whitelabel.enabled=false
server.error.path=/error
然后创建一个/error
路径的处理方法:
@Controller
public class ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request, Model model) {
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
model.addAttribute("status", statusCode);
model.addAttribute("error", exception != null ? exception.getMessage() : "N/A");
return "error";
}
}
通过上述方法,可以有效地处理@Aspect
中抛出的异常,并确保应用程序的稳定性和健壮性。
领取专属 10元无门槛券
手把手带您无忧上云