Java - Use Exception Handling to replace ErrorCode

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

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

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

做個紀錄!

首先,利用條件判斷的例子如下:
  1. public class ErrorCode {
  2. static String account = "Ben1";
  3. static String password = "1234";
  4. static String certification = "8888";
  5. static String errorMsg = null;
  6. /**
  7. * @param args
  8. */
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. if(!checkError1()){
  12. if(!checkError2()){
  13. if(!checkError3()){
  14. System.out.println("Login success!");
  15. }else{
  16. System.out.println(errorMsg);
  17. }
  18. }else{
  19. System.out.println(errorMsg);
  20. }
  21. }else{
  22. System.out.println(errorMsg);
  23. }
  24. }
  25. public static boolean checkError1(){
  26. if(!account.equals("Ben")){
  27. errorMsg = "account error!";
  28. return true;
  29. }
  30. return false;
  31. }
  32. public static boolean checkError2(){
  33. if(!password.equals("1234")){
  34. errorMsg = "password error!";
  35. return true;
  36. }
  37. return false;
  38. }
  39. public static boolean checkError3(){
  40. if(!certification.equals("8888")){
  41. errorMsg = "certification error!";
  42. return true;
  43. }
  44. return false;
  45. }
  46. }
例子很簡單,表示當執行程式時做三層的條件判斷,依序為帳號檢查、密碼檢查、認證碼等

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


再來是利用例外處理的形式,程式碼改寫如下:
  1. public class ReplaceErrorCode {
  2. static String account = "Ben1";
  3. static String password = "1234";
  4. static String certification = "8888";
  5. static String errorMsg = null;
  6. /**
  7. * @param args
  8. */
  9. public static void main(String[] args) {
  10. // TODO Auto-generated method stub
  11. try{
  12. checkError1();
  13. checkError2();
  14. checkError3();
  15. } catch(LoginCheckException e){
  16. System.out.println(e.getMessage());
  17. }
  18. }
  19. public static void checkError1() throws LoginCheckException{
  20. if(!account.equals("Ben")){
  21. throw new LoginCheckException("account error!");
  22. }
  23. }
  24. public static void checkError2() throws LoginCheckException{
  25. if(!password.equals("1234")){
  26. throw new LoginCheckException("password error!");
  27. }
  28. }
  29. public static void checkError3() throws LoginCheckException{
  30. if(!certification.equals("8888")){
  31. throw new LoginCheckException("certification error!");
  32. }
  33. }
  34. }
  35. class LoginCheckException extends Exception{
  36. public LoginCheckException(String msg){
  37. super(msg);
  38. }
  39. }

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

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

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

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

留言