Spring框架中异常处理情况分析

1.编写一个类,实现HandlerExceptionResolver接口

@Component
public class ExceptionResolver implements HandlerExceptionResolver {

    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {

        System.out.println("异常处理器正在执行中");

        ModelAndView mv = new ModelAndView();
        if (e instanceof NullPointerException){
            mv.addObject("msg","空指针异常");
        }else if (e instanceof AccessDeniedException){
            mv.addObject("msg","没有访问权限");

            System.out.println("111---222---333");
        }

        mv.setViewName("/error.html");
        return mv;
    }

}

步骤2:在类上添加@Component注解,将类放入容器中。
或者在配置文件中声明该类的bean标签

<bean class="com.itheima.exception.MyExceptionResolver"></bean>

1.异常处理 实现HandlerExceptionResolver接口 同一处理所有异常,需要手动细分异常 返回类型被限定为ModelAndView

2.自定义类,类上加注解@ControllerAdvice

@ControllerAdvice:声明该类是一个Controller的通知类,声明后该类就会被加载成异常处理器

//声明该类是一个Controller的通知类,声明后该类就会被加载成异常处理器
@ControllerAdvice
public class ExceptionAdvice {

    //类中定义的方法携带@ExceptionHandler注解的会被作为异常处理器,后面添加实际处理的异常类型
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public String doNullException(Exception ex) {
        return "空指针异常";
    }
	//算术异常
    @ExceptionHandler(ArithmeticException.class)
    @ResponseBody
    public String doArithmeticException(Exception ex) {
        return "ArithmeticException";
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public String doException(Exception ex) {
        return "all";
    }
}

两种异常处理的区别:
1.第二种注解异常处理可以处理handler方法参数出现异常的情况,而第一种处理不了。
2.第二种注解异常处理对结果更加灵活,可以返回ModelAndView、String、对象等。

3 对于异常响应状态的处理

    /**
     * 业务异常
     */
    @ExceptionHandler(BusinessException.class)
    public BaseResponse BusinessException(HttpServletResponse response, BusinessException ex) {
        Integer httpStatus = ex.getErrorCode();
		// 设置响应的状态码 不设置默认200  此时的业务异常码可能为401等, 所以要保持一样
        if (httpStatus != null) {
            response.setStatus(httpStatus);
        }
        return new BaseResponse();
    }	
	
	
	// 除了业务异常, 其他异常都可以设置为服务内部错误, 500
	// response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
	
	/**
     * 其它异常
     */
    @ExceptionHandler(Exception.class)
    public BaseResponse otherExceptionHandler(HttpServletResponse response, Exception ex) {
         
		// 内部服务异常 
        response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
        return new BaseResponse();
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值