spring全局异常捕获

本文详细介绍了Java中的异常处理机制,包括Throwable、Error、Exception等类的区别,以及RuntimeException和CheckedException的特点。同时,深入探讨了Spring框架中用于异常处理的注解,如@ExceptionHandler、@ControllerAdvice和@ResponseStatus,提供了自定义异常处理类和响应实体的实例。

异常介绍

Throwable是所有错误或异常的超类。Throwable类有两个直接子类:Error类和Exception类。

  • Error是指java运行时系统的内部错误和资源耗尽错误,是程序无法处理的异常,应用程序不会抛出该类对象。
  • Exception是程序本身可以处理的异常,应尽可能去处理这些异常。Exception分两类,一个是运行时异常RuntimeException,一个是检查异常CheckedException。
  • CheckedException一般是外部错误,这种异常都发生在编译阶段,Java编译器会强制程序去捕获此类异常。
  • RuntimeException是那些可能在Java 虚拟机正常运行期间抛出的异常的超类。这种错误是由程序员引起的错误,可以修正代码解决

spring异常处理的几个注解

  • @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
  • @ControllerAdvice:异常集中处理,更好的使业务逻辑与异常处理剥离开
  • @ResponseStatus:可以将某种异常映射为HTTP状态码

单使用@ExceptionHandler,只能在当前Controller中处理异常,与@ControllerAdvice组合使用,则可以实现全局异常处理,不用每个controller都配置。

简单举例

创建一个响应实体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class R {
    private String msg;
    private Object data;
    private int code;
    //请求成功 start
    public static R success(String msg,Object data,int code){
        return new R(msg,data,code);
    }

    public static R success(){
        return success(null,null,RespCode.SUCCESS.code);
    }

    public static R success(String msg,Object data){
        return success(msg,data,RespCode.SUCCESS.code);
    }

    public static R success(Object data){
        return success(RespCode.SUCCESS.msg,data,RespCode.SUCCESS.code);
    }
    //请求成功 end
    /**
     * 请求失败
     * @param msg
     * @param code
     * @return
     */
    public static R fail(String msg,int code){
        return new R(msg,null,code);
    }

    /**
     * 请求参数错误
     * @return
     */
    public static R invalidParam(){
        return new R(RespCode.BAD_REQUEST.msg,null,RespCode.BAD_REQUEST.code);
    }

}

请求响应码枚举

public enum RespCode {
    SUCCESS("请求成功",20200),
    FAIL("请求失败",50501),
    BAD_REQUEST("请求参数有误",40401),
    INTERNAL_SERVER_ERROR("系统出错,请稍后再试或联系管理员",50500),
    AUTH_FAIL("认证失败",30300),
    AUTH_DENY("权限不足",30301),
    METHOD_NOT_ALLOWED("请求方式错误",40501),
    DEFAULTERROR("系统繁忙",90999),
    NULL_DATA("未找到记录",70701),
    NOT_LOGIN("未登录",70702),
    INVALID_DATA("数据验证不通过",70703),
    BUSINESS_ERROR("业务异常",70704);


    RespCode(String msg,int code){
        this.code = code;
        this.msg = msg;
    }
    public String msg;
    public int code;

}

自定义全局异常拦截类

@ControllerAdvice
public class TestExceptionHandler {
 	//指定跳转错误视图
    public static final String ERROR_VIEW = "error";

    //指定拦截的异常类型,可自定义异常
    @ExceptionHandler(value = NullPointerException.class)
    public Object errorHandler(HttpServletRequest reqest,
            HttpServletResponse response, NullPointerException e) throws Exception {
 
        e.printStackTrace();
 
        if (isAjax(reqest)) {
            return R.fail(e.getMessage(),RespCode.FAIL.code);
        } else {
            ModelAndView mav = new ModelAndView();
            mav.addObject("exception", e);
            mav.addObject("url", reqest.getRequestURL());
            mav.setViewName(ERROR_VIEW);
            return mav;
        }
    }
 
    /**
     *
     * @Description: 判断是否是ajax请求
     */
    public static boolean isAjax(HttpServletRequest httpRequest){
        return  (httpRequest.getHeader("X-Requested-With") != null
                    && "XMLHttpRequest"
                        .equals( httpRequest.getHeader("X-Requested-With").toString()) );
    }
}

自定义异常继承Exception类,则为受检查异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值