Springmvc中的异常处理@ControllerAdvice和@ExceptionHandler

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("年龄错误");
       
        }
        ...
        ...

    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值