最近在书写代码的时候对于代码中的异常处理进行了一些思考
目前基于网页开发大多数前台都有关于数据类型的校验处理,如不给输入数字等等,也过滤一些异常,这里说的是基于系统中一些不用网页输入所导致的一些错误
对于异常处理分为几类:
1、如系统中某些流程需要批量倒入模板,如出现错误需要提示
2、系统中某些集成错误
3、系统中的未知错误
针对情况1:
如果用try-catch块经行异常处理你可能会觉得很累,因为用户往往想一次性把所有的异常获知,而不是一条条的异常经行处理
如:每个字段处理的异常条件都不一样
public class MyTest1 {
public String f1(){
StringBuilder errorMessage = new StringBuilder();
try{
//检查字段1
throw new Exception();
}catch(Exception1 e){
errorMessage.append("errorMessage1");
}
try{
//检查字段2
throw new Exception();
}catch(Exception2 e){
errorMessage.append("errorMessage2");
}
try{
//检查字段3
throw new Exception();
}catch(Exception3 e){
errorMessage.append("errorMessage3");
}
return errorMessage.toString();
}
public String f2(){
StringBuilder errorMessage = new StringBuilder();
int i = 1;
if(i==1){ //条件1
errorMessage.append("errorMessage1");
}
if(i==1){ //条件2
errorMessage.append("errorMessage2");
}
if(i==1){ //条件3
errorMessage.append("errorMessage3");
}
return errorMessage.toString();
}
}
对比f1()和f2()是不是感觉f2() 这种处理异常的方式比较简便好维护
其实JAVA “被检查异常” 设计的初衷是方便异常处理的代码书写,但是如果用户一次性知道并处理这些异常,好像这个机制并不大适用,而是用逻辑处理并独立出方法更为清晰
而针对二三种情况而言:
由于系统出现异常并不是用户可以处理的异常,程序终止并告诉用户,这种机制就非常清晰,这种机制处理一些递进式的错误更有优势,
如一个方法,做了三件事
1、创建了一个A类
2、在A类中新建一个变量
3、用该变量进行计算
try-catch块错误1、错误2、错误3 分别对应三件事的异常,这是如果出现异常返回用户在那一步出现了异常也非常合理,因为这些步骤是连锁的
错误就非常清晰了,如果用逻辑判断会产生大量的if-else,错误处理块也隐藏在else块代码,维护起来非常困难
如:
public class MyTest1 {
public static void main(String[] argr){
}
private static void f1(){
try{
//步骤1
//步骤2
//步骤3
}catch(Exception1 e){
//处理错误1
}catch(Exception2 e){
//处理错误2
}catch(Exception3 e){
//处理错误3
}
}
private static void f2(){
StringBuilder errorMessage = new StringBuilder();
int i = 1;
if(i==1){ //条件1
//处理错误1
}else{
if(i==1){ //条件2
if(i==1){ //条件3
errorMessage.append("errorMessage3");
}else{
//处理错误2
}
}else{
//处理错误3
}
}
}
}
像f1()不用考虑各步骤中出现的异常,可以一直往下书写,异常处理集中在catch块处理,结构非常清晰,代码维护非常方便
前提是各步骤要抛出相应的异常,否则只返回成功/失败的消息还需要手动写if块抛出异常,如何不返回消息出现反法内“吞噬”异常或者直接抛出到main()
而不告诉用户,就是一种程序的“作弊”行为,本人比较偏向于第一种方式,是一种很好的代码风格