SpringMVC异常处理器

1.异常

1.1 异常结构层次

在这里插入图片描述
异常主要分为:错误、一般性异常(检查异常)、运行期异常(非受控异常)

  1. 错误:如果应用程序出现了 Error,那么将无法恢复,只能重新启动应用程序,最典型的
    Error 的异常是:OutOfMemoryError
  2. 检查异常:出现了这种异常必须显示的处理,不显示处理 java 程序将无法编译通过
  3. 非受控异常:此种异常可以不用显示的处理,例如被 0 除异常,java 没有要求我们一定要处理

1.2自定义异常

自定义异常通常继承于 Exception 或 RuntimeException,到底继承那个应该看具体情况来定。


import java.io.*;
public class ExceptionTest20 {
    public static void main(String[] args) {
        method1(10, 0);
    }
    private static void method1(int value1, int value2){
    //throws MyException { 
    if (value2 == 0) {
        //抛出非受控异常,方法可以不适用throws 进行声明
        //但也也可以显示的声明
        throw new MyException("除数为 0");
    }
    int value3 = value1 / value2;
    System.out.println(value3);
    }
}
//自定义非受控异常
class MyException extends RuntimeException {
    public MyException() {
    //调用父类的默认构造函数
        super();
    }
    public MyException(String message) {
        //手动调用父类的构造方法
        super(message);
    } 
}

2.SpringMVC异常处理器

2.1 基于配置的异常处理

SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver(要自定义异常类需要时间该接口)

HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver和
SimpleMappingExceptionResolver

SpringMVC提供了自定义的异常处理器SimpleMappingExceptionResolver,使用方式:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 
	<!--进行异常视图映射,当触发xx异常,就跳转到相应视图
		exceptionMappings和exceptionAttribute都是SimpleMappingExceptionResolver这个类中的属性
-->
	<property name="exceptionMappings"> 
		<props> 
		<!--键表示处理器方法执行过程中出现的异常 ,值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面 
		--> 
			<prop key="java.lang.ArithmeticException">error</prop> 
		</props> 
	</property> 
	<!--exceptionAttribute:
		设置一个属性名,将出现的异常信息在请求域中进行共享
		ex表示传送到前端数据中的key
	 --> 
	<property name="exceptionAttribute" value="ex"></property> 
</bean>

2.2 基于注解的异常处理

实例1:

//@ControllerAdvice将当前类标识为异常处理的组件 
@ControllerAdvice
public class ExceptionController {
    //@ExceptionHandler用于设置所标识方法处理的异常 
    @ExceptionHandler(ArithmeticException.class)
	//ex表示当前请求处理中出现的异常对象 
    public String handleArithmeticException(Exception ex, Model model){
        model.addAttribute("ex", ex);
        return "error";
    }
}

实例2:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3 @RestControllerAdvice @ExceptionHandler

在这里插入图片描述

在这里插入图片描述

3.全局异常处理

在这里插入图片描述
在这里插入图片描述

@ControllerAdvice  //控制器增强类
@Slf4j
public class ExceptionCatch {

    /**
     * 处理不可控异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResponseResult exception(Exception e){
        e.printStackTrace();
        log.error("catch exception:{}",e.getMessage());

        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR);
    }

    /**
     * 处理可控异常  自定义异常
     * @param e
     * @return
     */
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseResult exception(CustomException e){
        log.error("catch exception:{}",e);
        return ResponseResult.errorResult(e.getAppHttpCodeEnum());
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值