springmvc框架采用的是统一、全局的异常处理。把controller中的所有异常处理都集中到一个地方。采用的是AOP的思想、把业务逻辑和异常处理代码分开,降低耦合。Springmvc中的异常处理主要用到以下两个注解@ControllerAdvice和@ExceptionHandler。
1.自定义一个异常类MyUserException
public class MyUserException extends Exception{
public MyUserException(){
super();
}
public MyUserException(String message){
super(message);
}
}
2.再分别定义它的子类NameException、 AgeException
//当用户姓名出现异常,抛出NameException
public class NameException extends Exception{
public NameException(){
super();
}
public NameException(String message){
super(message);
}
}
//当用户年龄出现异常,抛出AgeException
public class AgeException extends Exception{
public AgeException(){
super();
}
public AgeException(String message){
super(message);
}
}
3.创建一个普通类,作为全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler{
@ExceptionHandler(value = NameException.class)
public ModelAndView doNameException(Exception exception){
//处理NameException的异常
//异常处理的逻辑:
//1.需要把异常记录下来,记录到数据库,日志文件。
//记录日志发生的时间,哪个方法发生的,异常错误内容。
//2.发送通知,把异常信息通过邮件,短信,微信发给相关人员。
//3.给用户友好的提示。
ModelAndView mv = new ModelAndView();
mv.addObjcect("msg","姓名必须是张三,其它用户不能访问");
mv.addObjcect("ex","exception");
mv.setViewName("nameError");
return mv;
}
@ExceptionHandler(value = AgeException.class)
public ModelAndView doAgeException(Exception exception){
//处理AgeException的异常
ModelAndView mv = new ModelAndView();
mv.addObjcect("msg","你的年龄不能大于80");
mv.addObjcect("ex","exception");
mv.setViewName("ageError");
return mv;
}
//处理未知异常
@ExceptionHandler
public ModelAndView defaultException(Exception exception){
ModelAndView mv = new ModelAndView();
mv.addObjcect("msg","未知异常");
mv.addObjcect("ex","exception");
mv.setViewName("defaultError");
return mv;
}
}
控制器增强(也就是说给控制类增加功能--异常处理功能)
位置:在类的上面
特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。
指定@ControllerAdvice所在的包名 。
处理异常的方法和控制器的定义一样,可以有多个参数,可以有ModelAndView、String、void、对象类型的返回值。
形参:Exception,表示Controller中抛出的异常对象,通过形参可以获取发生的异常信息。
4.加入注解
<context:component-scan base-package="com.demo.handler" />
<mvc:annotation-driven />
其中com.demo.handler为GlobalExceptionHandler所在文件夹,目的是为了扫描包并自动创建对象
5.使用
@Controller
public class MyController{
@RequestMapping("value = "/some")
public ModelAndView dosome(String name,Integer age)throws MyUserException{
ModelAndView mv = new ModelAndView();
if("张三".equal(name)){
throw new NameException("姓名错误");
}
if(age == null || age > 80){
throw new AgeException("年龄错误");
}
...
...
}
}