Java里面的异常在真正工作中使用还是十分普遍的。什么时候该抛出什么异常,这个是必须知道的。
在给出异常分装例子之前,需要给大家普及Java里面的checked异常和unchecked异常的个概念。
这里之所以让大家清楚checked异常和unchecked异常概念,是因为:待会我们的异常是继承unchecked异常RuntimeException的。了解一下并无坏处嘛
checked异常:
表示无效,不是程序中可以预测的。比如无效的用户输入,文件不存在,网络或者数据库链接错误。这些都是外在的原因,都不是程序内部可以控制的。
必须在代码中显式地处理。比如try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。
继承自java.lang.Exception(java.lang.RuntimeException除外)。
unchecked异常:
表示错误,程序的逻辑错误。是RuntimeException的子类,比如IllegalArgumentException, NullPointerException和IllegalStateException。
不需要在代码中显式地捕获unchecked异常做处理。
继承自java.lang.RuntimeException(而java.lang.RuntimeException继承自java.lang.Exception)。
看下面的异常结构图或许层次感更加深些:
package com.rbs.enums;
/**
* @Description: 错误枚举类
* @Param:
* @return:
* @Author: ywj
* @Date: 2019/5/21 0021
*/
public enum RongRunErrorCodeEnum {
/**
* 成功状态码
*/
SUCCESS(0, "成功"),
/**
* 参数为空
*/
PARAM_EMPTY(1, "参数为空"),
/**
* 获取openid为空
*/
OPENID_IS_EMPTY(2, "获取openid为空"),
/**
* 登录失败
*/
LOGIN_FAILED(3, "登录失败"),
/**
* openid未绑定
*/
OPENID_NOT_BIND(4, "openid未绑定"),
/**
* 密码错误
*/
WRONG_PASSWORD(5, "密码错误"),
/**
* 账号不存在
*/
ACCOUNT_NOT_EXIST(6, "帐号不存在"),
/**
* 用户在该系统没有权限
*/
ACCOUN_NO_AUTHORITY(7, "用户在该系统没有权限"),
/**
* base64编码为空
*/
BASE64_IS_EMPTY(8, "base64编码为空"),
/**
* 图片识别类型为空
*/
RECOGNITION_TYPE_EMPTY(9, "图片识别类型为空"),
/**
* 调用接口失败
*/
CALL_INT_FAIL(10, "调用接口失败"),
/**
* 获取权限信息失败
*/
GET_QX_FAIL(11, "获取权限信息失败"),
/**
* 获取信息不存在
*/
PARAM_NOT_EXIST(12, "获取信息不存在"),
/**
* 系统异常
*/
SYSTEM_ERROR(500, "系统异常");
/**
* 状态码
*/
private Integer code;
/**
* 异常信息
*/
private String msg;
/**
* 异常枚举信息
*
* @param code 状态码
* @param msg 信息
*/
RongRunErrorCodeEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
/**
* 获取状态码
*
* @return
*/
public Integer getCode() {
return code;
}
/**
* 获取信息
*
* @return
*/
public String getMsg() {
return msg;
}
/**
*重写toString方法在控制台显示自定义异常信息
* @return
*/
@Override
public String toString() {
return "[异常码:"+this.code+" 异常信息:"+this.msg+"]";
}
}
这里重写了toString的方法,用于控制台打印消息
2、创建一个异常类RRException,继承RuntimeException:
package com.rbs.exception;
import com.rbs.enums.RongRunErrorCodeEnum;
import com.rbs.enums.ServeEnum;
import com.rbs.enums.SysEnum;
/**
* @ClassName CustomException
* @Author ywj
* @Describe 自定义异常
* @Date 2019/5/21 0021 11:58
*/
public class RRException extends RuntimeException {
/**
* 自定义异常信息
*/
private String msg;
/**
* 状态码
*/
private int code = 500;
/**
* 使用枚举类限制异常信息
* @param errorCodeEnum 异常封装枚举类
*/
public RRException(RongRunErrorCodeEnum errorCodeEnum) {
super( errorCodeEnum.toString());
this.msg = errorCodeEnum.getMsg();
this.code = errorCodeEnum.getCode();
}
/**
* 获取异常信息
* @return
*/
public String getMsg() {
return msg;
}
/**
* 获取状态码
* @return
*/
public int getCode() {
return code;
}
}
这里要注意继承了RuntimeException,因为一般我们的业务异常都是运行时异常。我在这里就展示一个方法作为例子
3、测试类ExceptionTest.java:
package com.rbs.test;
import com.rbs.enums.HttpCodeEnum;
import com.rbs.enums.RongRunErrorCodeEnum;
import com.rbs.enums.ServeEnum;
import com.rbs.enums.SysEnum;
import com.rbs.exception.HttpException;
import com.rbs.exception.RRException;
/**
* @ClassName exceptiontest
* @Author ywj
* @Describe
* @Date 2019/5/28 0028 9:36
*/
public class exceptiontest {
public static void main(String[] args) throws HttpException {
ss();
}
public static void ss() throws HttpException {
String str = null;
if (str == null) {
throw new RRException(RongRunErrorCodeEnum.PARAM_EMPTY, ServeEnum.ACTION, SysEnum.VALUE_MARKETING);
}
}
}
测试结果:
一般公司都会分装一个基础框架,异常分装是其中一部分。