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

被折叠的 条评论
为什么被折叠?



