springmvc 异常处理
springmvc使用handlerExceptionRosolver来处理异常
在默认情况下springmvc加载的异常处理器有:
ExceptionHandlerExceptionResolver:主要用来处理使用@ExceptionHandler注解定义的方法
ResponseStatusExceptionResolver:
DefaultHandlerExceptionRosolver:
一、ExceptionHandlerExceptionResolver
处理使用@ExceptionHandler注解定义方法
注意点:
1、@ExceptionHandler定义的方法可以加入Exception参数 ,该参数即对应发生异常的对象。
2、@ExceptionHandler定义的方法不可以使用map作为参数,如果要把异常信息返回到错误页面上,需要返回ModelAndView
3、如果一个类里面有多个@ExceptionHandler标记的方法,那么springmvc会调用最接近于发生异常的类型的方法
4、如果当前Handler中没有@ExceptionHandler方法来处理当前的异常,则将会@ControllerAdvice中去找@ExceptionHandler标记的方法
例子:
目标方法:
@RequestMapping("testExceptionHandlerExceptionResolver") public String testExceptionHandlerExceptionResolver(@RequestParam("i") int i) { System.out.println("result = " + 10 / i); return "success"; }
处理异常的方法:
@ExceptionHandler({ Exception.class }) public ModelAndView testHandlerException(Exception exception) { System.out.println("出错了:" + exception); ModelAndView modelAndView = new ModelAndView("error"); modelAndView.addObject("exception", exception); return modelAndView; }
页面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Error Page</title> </head> <body> <h4>Error Page</h4> <h3>${exception }</h3> </body> </html>
也可以使用@ControllerAdvice注解处理异常的类,可以统一处理异常:
package com.hy.springmvc.exception; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; @ControllerAdvice public class HandleException { @ExceptionHandler({ Exception.class }) public ModelAndView testHandlerException(Exception exception) { System.out.println("[1]出错了:" + exception); ModelAndView modelAndView = new ModelAndView("error"); modelAndView.addObject("exception", exception); return modelAndView; } }
二、ResponseStatusExceptionRosolver
处理@ReponseStatus标记的异常类或异常方法
@ResponseStatus注解有两个属性reason和value
value指返回到页面上的错误码,reason指打印到页面上的错误原因
当目标方法中抛出异常类对应的异常时会返回相应的错误页面
如果在目标方法上使用了@ResponseStatus注解那么一定会返回错误页面,即使没有抛出相应的异常!
三、DefaultHandlerExceptionRosolver
处理springmvc里面的一些特定异常
四、SimpleMappingExceptionResolver
对所有异常统一处理,可以在配置文件中配置异常的类名和对应的视图名称,可以在错误页面中打印出错误的日志信息。