常见的异常处理包括404/500等服务器异常后的页面跳转,以及代码编译异常的处理(跳转页面或处理该异常),这里展示4种最基础方法
1. web.xml根据状态码跳转页面
-
设置web.xml
- 由于前端控制器对资源的拦截,无法直接跳转到视图,所以location设置的是控制器映射路径
- 除了响应码标签配置error-code外,还有异常类名标签配置:exception-type
<!-- 报错页面跳转 --> <error-page> <error-code>404</error-code> <location>/error</location> </error-page>
-
控制器跳转
@RequestMapping("error") public String error() { return "404"; }
2. 利用控制器拦截所有非指定路径
-
// 这种方式不建议使用 @RequestMapping("*") public String error2() { return "404"; }
3. 设置异常解析器对指定异常进行处理
-
beans.xml中设置异常解析器
<!-- 简单异常解析器 --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 异常映射,可设置多个异常,一旦出现就跳转到指定视图 --> <property name="exceptionMappings"> <props> <!-- 出现该异常跳转到exception视图,不经过控制器 --> <prop key="java.lang.ArithmeticException">exception</prop> </props> </property> </bean>
-
测试
// url进入该路径,查看是否跳转页面 @RequestMapping("intercept") @ResponseBody public void intercept() { /* * 出现异常“java.lang.ArithmeticException” * 我们在xml中利用异常解析器对其进行拦截,然后跳转到“exception.jsp” */ int i = 1/0; }
4. 设置异常处理注解@ExceptionHandler
-
示例
// 测试下面配置的@ExceptionHandler是否起作用 @RequestMapping("intercept") @ResponseBody public void intercept() { Integer[] integers = {1, 1}; for (int i = 0; i <= 2; i++) { // 数组下标越界:java.lang.ArrayIndexOutOfBoundsException System.out.println(integers[i]); } } // 拦截上面intercept方法中的数组下标越界异常,然后跳转页面 @ExceptionHandler(ArrayIndexOutOfBoundsException.class) public String exceptionHandler() { System.out.println("error: java.lang.ArrayIndexOutOfBoundsException"); return "exception"; }
-
注意:
-
与异常解析器类似,也是拦截指定的异常,非指定的异常不作处理
-
异常处理方法与出现异常的方法只能在一个控制器内,为了全局起效,可将@ExceptionHandler方法放在@ControllerAdvice控制器中
@ControllerAdvice public class MyGlobalExceptionHandler { @ExceptionHandler(Exception.class) public ModelAndView customException(Exception e, ModelAndView mv) { mv.addObject("message", e.getMessage()); mv.setViewName("exception"); return mv; } }
-