• 后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节7(核心对象,异常处理器,ExceptionHandlerExceptionResolver & ResoponseStatusExceptionResolver)


    1、概念

      它的概念是建立异常类型与方法之间的映射关系。即出错之后,运行指定的方法。

      当抛出异常之后,会查找有@ExceptionHandler注解的方法,默认情况下只会在当前Controller类中查找。若要设置全局的, 可以配置Controller的切面。具体做法把异常处理的方法提取到公共类中,在类上添加@ControllerAdvice注解,在方法上添加@ExceptionHandler注解。。

      @ExceptionHandler只有一个属性value,值为异常类型对应的Class类集合。

      当value属性为空时,相当于默认值,会处理所有的异常。

      若value值重复时,即一个exception 类型有多个方法与之对应时,抛出IllegalStateException。

      当异常抛出,被HandlerExceptionResolver处理之后,抛出的异常被捕获,请求会被视为正常结束,返回的状态码为200。若想返回特定的响应码,可以配合@ResponseStatus注解。

    2、使用

      第一步,注入ExceptionHandlerExceptionResolver,查看dispatcher.properties,它是默认存在的,无需额外的配置。

      第二步,编写方法handlerException,标注@ExceptionHandler,value属性指定异常类型。

      注:@ControllerAdvice相当于AOP中的advice

    3、示例

      若配置适用于单个Controller,示例如下

    // 请求的方法
    @GetMapping("/test/exception")
    public String divideNumber() {
    	System.out.println(1 / 0);
    	return "";
    }
    
    // 处理异常的方法
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView resolve() {
    	return new ModelAndView("error/arithmeticException");
    }

      若配置适用于全局的异常处理,示例如下:

    // 相当于AOP中的advice
    @ControllerAdvice
    public class ExceptionController {
    	/**
    	 * 
    	 * @Title: resolve
    	 * @Description:解决异常的方法
    	 * @return
    	 */
    	@ExceptionHandler(value = ArithmeticException.class)
    	public ModelAndView resolve() {
    		return new ModelAndView("error/arithmeticException");
    	}
    }

    4、ResponseStatusExceptionResolver

      它的概念是建立异常类型与响应码之间的映射关系,若没有上述的ExceptionResolver,Web容器会根据响应码生成特定的页面,例如最常见的404,501。若使用上述的ExceptionResolver,它只会改变响应码的值。

      ResponeStatusExceptionResolver会根据@ResponseStatus注解的code属性值返回响应码

      当@ResponseStatus标注在异常类上时,它只适用于自定义异常。Java内置,第三方的异常类型无法修改,例如NullPointerException

      当@ResponseStatus标注在ExceptionHandler的handler方法上时,它适用于该方法匹配的所有异常。

      当@ResponseStatus标注在@RequestMapping的方法上时,设置方法的响应码,无论方法是否正常结束。

      使用时需要注入ResponeStatusExceptionResolver,它是默认注入的。

  • 相关阅读:
    Kafka 文档用例
    Kafka 文档引言
    关于工作流核心选择
    IEEE浮点标准
    新项目的CQRS设计
    持续集成:CruiseControl.NET + VisualSVN.Server
    商城(一)
    Maven基础学习(一)—Maven入门
    Mybatis基础学习(五)—缓存
    Mybatis基础学习(四)—关系映射
  • 原文地址:https://www.cnblogs.com/rain144576/p/12903067.html
Copyright © 2020-2023  润新知