异常处理器
基于配置的异常处理
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver
HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和SimpleMappingExceptionResolver
SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props>
<prop key="java.lang.ArithmeticException">error</prop> </props> </property>
<property name="exceptionAttribute" value="ex"></property> </bean>
|
完整代码
1 2 3 4 5 6 7 8 9 10
| <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.ArithmeticException">error</prop> </props> </property> <property name="exceptionAttribute" value="ex"></property> </bean>
|
1 2 3 4 5
| @RequestMapping("/testExceptionHandler") public String testExceptionHandler(){ System.out.println(1/0); return "success"; }
|
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> 出现错误 <p th:text="${ex}"></p> </body> </html>
|
基于注解的异常处理@ControllerAdvice
1 2 3 4 5 6 7 8 9 10 11 12 13
| @ControllerAdvice public class ExceptionController {
@ExceptionHandler(ArithmeticException.class) public String handleArithmeticException(Exception ex, Model model){ model.addAttribute("ex", ex); return "error"; }
}
|
完整代码
1 2 3 4 5 6 7 8 9 10
| @ControllerAdvice public class ExceptionController {
@ExceptionHandler(value = {ArithmeticException.class,NullPointerException.class}) public String testException(Exception ex, Model model){ model.addAttribute("ex",ex); return "error";
} }
|
实际应用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| package com.itheima.reggie.common;
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController;
import java.sql.SQLIntegrityConstraintViolationException;
@ControllerAdvice(annotations = {RestController.class, Controller.class}) @ResponseBody @Slf4j public class GlobalExceptionHandler {
@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("未知错误"); }
@ExceptionHandler(CustomException.class) public R<String> exceptionHandler(CustomException ex){ log.error(ex.getMessage()); return R.error(ex.getMessage()); } }
|