Java - Use Exception Handling to replace ErrorCode

一般我們在做錯誤檢查的時候,會用到不少的條件判斷,以此導向我們要的結果或不符合的

結果處理。但如果當下的檢查太過於繁雜,就會造成巢狀似的判斷,在程式碼的可讀性上顯

得有些複雜! 因此在這邊主要是引用Java重構 - 結城浩先生書內提到的概念,並舉個例子

做個紀錄!

首先,利用條件判斷的例子如下:
public class ErrorCode {
 static String account = "Ben1";
 static String password = "1234";
 static String certification = "8888";
 static String errorMsg = null;
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  if(!checkError1()){
   if(!checkError2()){
    if(!checkError3()){
     System.out.println("Login success!");
    }else{
     System.out.println(errorMsg);
    }
   }else{
    System.out.println(errorMsg);
   }
  }else{
   System.out.println(errorMsg);
  }
 }

 public static boolean checkError1(){
  if(!account.equals("Ben")){
   errorMsg = "account error!";
   return true;
  }
  return false;
 }
 
 public static boolean checkError2(){
  if(!password.equals("1234")){
   errorMsg = "password error!";
   return true;
  }
  return false;
 }
 
 public static boolean checkError3(){
  if(!certification.equals("8888")){
   errorMsg = "certification error!";
   return true;
  }
  return false;
 }
}
例子很簡單,表示當執行程式時做三層的條件判斷,依序為帳號檢查、密碼檢查、認證碼等

,都是以hard code的型式表示,由於只是想呈現概念囉!


再來是利用例外處理的形式,程式碼改寫如下:
public class ReplaceErrorCode {
 static String account = "Ben1";
 static String password = "1234";
 static String certification = "8888";
 static String errorMsg = null;
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  try{
   checkError1();
   checkError2();
   checkError3();
  } catch(LoginCheckException e){
   System.out.println(e.getMessage());
  }
 }

 public static void checkError1() throws LoginCheckException{
  if(!account.equals("Ben")){
   throw new LoginCheckException("account error!");
  }
 }
 
 public static void checkError2() throws LoginCheckException{
  if(!password.equals("1234")){
   throw new LoginCheckException("password error!");
  }
 }
 
 public static void checkError3() throws LoginCheckException{
  if(!certification.equals("8888")){
   throw new LoginCheckException("certification error!");
  }
 }
}

class LoginCheckException extends Exception{
 public LoginCheckException(String msg){
  super(msg);
 }
}

主要是另外自訂了一個Exception class,再來改寫checkError method,若條件不符的話,就

丟出一個例外,並且在呼叫端的地方才進行catch,因此必須在該method做

throws LoginCheckException,如此一來,在呼叫端的method若有問題,就集中在此被catch

,也不必做巢狀判斷式,一旦其中一個method有問題,就會立即被捕捉印出錯誤訊息!

留言