java使⽤枚举类实现⾃定义异常
记录⼀些⼩知识点:
1、java异常根本⽗类为Throwable, Throwable有两个⼦类:Error和Exception。
2、Exception常见的⼦类有:
DataFormatException, IOException, NoSuchFieldException, RuntimeException, SQLException, TimeoutException。
3、RuntimeException常见的⼦类有:
BufferOverflowException, ClassCastException, IndexOutOfBoundsException,NullPointerException, SystemException。
4、Error不需要讨论,这些错误是正常编码不会出现或者在程序层⾯⽆法处理的事情。
5、Error和RuntimeException是⾮检查型异常,其他的都是检查型异常。
try catch的使用方法 检查型异常,顾名思义,编辑器会帮助你检查,如果你编码错误,编辑器会报红,如果可能出现此种
异常,必须要⽤try-catch包裹住。
运⾏时异常,不需要使⽤try-catch包裹,编码编译可以通过。
6、另说个⼩坑:如果在更新服务器时,忘记了更新某些⽂件导致⽅法不到的异常,好像是抛出了error的⼀个⼦类,反正exception没有捕获到,⽇志⾥也没有任何体现,很坑。
现在开始编写⾃定义异常
1、枚举类
/**
* 异常模板,ecode可以作为统⼀的应答码
* @author C
* @date 2018年12⽉12⽇上午10:10:42
*/
public enum CExceptionEnums {
SERVER_DO_ERROR ("0001","交易处理失败"),
SERVER_FTP_DOWN_ERROR ("0002","从ftp下载⽂件失败"),
SERVER_ALIYUN_UPLOAD_ERROR ("0003","上传阿⾥云失败"),
SERVER_IMG_ERROR ("0004","图⽚错误"),
SERVER_DB_ERROR ("0005","数据库错误"),
SERVER_OTHER_ERROR ("1099","其他异常");//枚举类如果写⽅法的话,此处需要写分号
private String ecode;
private String emsg;
CExceptionEnums(String ecode, String emsg) {
}
public String getEcode() {
return ecode;
}
public String getEmsg() {
return emsg;
}
public static CExceptionEnums statOf(String ecode) {
for (CExceptionEnums state : values())
if (Ecode().equals(ecode))
return state;
return null;
}
}
2、⾃定义异常
/**
* ⾃定义异常
* @author C
* @date 2018年12⽉12⽇上午10:09:15
*/
public class CException extends Exception implements java.io.Serializable {
private static final long serialVersionUID = 1L;
/
*
* 模版异常
private CExceptionEnums exceptionEnums;
/*
* ⾃定义异常信息
*/
private String errorDetail;
/**
* 带⾃定义异常信息的构造⽅法
* @param exceptionEnums
* @param errorDetail
*/
public CException(CExceptionEnums exceptionEnums,String errorDetail){
}
/**
* 模版异常的构造⽅法
* @param exceptionEnums
*/
public CException(CExceptionEnums exceptionEnums){
}
public CExceptionEnums getExceptionEnums() {
return exceptionEnums;
}
public String getErrorDetail() {
return errorDetail;
}
public void setErrorDetail(String errorDetail) {
}
}
3、使⽤⽅法
/**
*
* @author C
* @date 2018年12⽉12⽇上午10:11:35
*/
public class exceptionTest {
public static void main(String[] args) {
try{
//⾃⼰⽅法内部的异常可以统⼀⽤exception捕获,在catch中再抛出CxzException,在上⼀层⽅法⾥⽤CxzException捕获 //⾃定义异常⽤法⽰例
if(true){
//可以使⽤模版异常
throw new CException(CExceptionEnums.SERVER_DO_ERROR);
}
if(false){
//也可以⾃定义msg信息
throw new CException(CExceptionEnums.SERVER_DO_ERROR,"⾃定义msg信息");
}
dbfunc();
}catch(CException ex){
//捕获⾃定义异常
ex.printStackTrace();
System.out.String());
CExceptionEnums enums = ex.getExceptionEnums();
//此处逻辑,若⽆⾃定义信息,则使⽤默认enums中的msg,如有,则使⽤⾃定义异常信息
if (null != ex.getErrorDetail()){
//如果⾃定义信息不是null,就使⽤⾃定义信息
String cmsg = ex.getErrorDetail();
}
}catch(Exception ex){
}
}
/**
* 假设这是个与数据库有关的⽅法
* ⽅法内抛异常可以⽤Exception捕获,再抛出CxzException,上级去处理
* @throws CException
*/
private static void dbfunc() throws CException{
if(true){
throw new Exception("数据库异常信息");
}
}catch(Exception ex){
System.out.Message());//打印⽇志--异常中可能有数据库表或字段的名字,不对外暴露
throw new CException(CExceptionEnums.SERVER_DB_ERROR);//对外不暴露数据库信息,只显⽰模版异常
}
}
}
这样,⾃⼰的项⽬就可以对外有⼀个统⼀的应答码(⽐如你是⼀个对外提供接⼝的程序或者对前台的响应),报错信息也由⾃⼰编写,对外不暴露项⽬的⼀些东西。
另:
在springMvc中,,这个还没研究,先附个链接。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论