錯誤處理的一點思考 (轉)

amyz發表於2007-11-13
錯誤處理的一點思考 (轉)[@more@]

錯誤處理的一點思考:namespace prefix = o ns = "urn:schemas--com::office" />

  “世界上並不存在完全無錯的”,我們不討論它是不是一條真理。但它的確是一條警語,它告誡我們在編寫程式時一定要注意儘可能地避免錯誤。

程式執行出錯時會超出程式設計師的控制,使得程式“南轅北轍”,不僅無法正常完成功能,而且還會出現一些可怕的事情。

由於的錯誤而引起的事故數不勝數,損失最巨大的是美國的一次火箭發射,在那次悲劇中,在程式中由於錯把“,”寫成了“;”,卻使得火箭在天上爆炸,所以為防止程式設計錯誤花再大的人力、物力也是應該的。

以上這段話說明了錯誤處理的重要性。

  最有效的解決方法是在程式設計是,有意識地加入一些機制,使其能夠在執行時檢測自己,在錯誤失控之前,報告出來。

最常見的一種錯誤處理是為每一個方法(其它語言,就是每一個)返回一個狀態值,用來指示該方法是否成功、正確地完成了任務。當這個方法的程式收到了一個錯誤的狀態值,就能夠得知程式出錯了,再採取有效的措施避免這個錯誤引起的問題(最簡單的方法就是退出程式,或給出提示提醒操作者)。

首先讓我引入一個概念:錯誤

所謂的錯誤模式,我理解和設計模式所涉及到的知識應該是一樣的,錯誤模式就是已發出的錯誤和程式中潛在的錯誤之間的重複出現的相互關係。這種概念對來說並不是新鮮的,隨便極端程式設計的出現,RUP,單元測試只能解決一部分存在的問題,所以我們採用錯誤模式,一個錯誤的出現,只要遵循我們可以識別的錯誤模式中的一種,隨可以得知這個錯誤的原因並且糾正它。

有興趣的朋友可以搜搜錯誤模式,有許多文章介紹的。以下是我要介紹的二種錯誤處理方式。

一 構造錯誤異常:

構造錯誤異常,這裡就利用了錯誤模式去發現錯誤並糾正它,首先讓看一段程式碼:

InvalidNameException.

class InvalidNameException extends Exception{
  public InvalidNameException(){
  }
}

程式中:

public User validate(String userName,String pass) throws InvalidNameException{
  if(userName.equals("java")){
  }else{
  throw new InvalidNameException();
  }
  //return null;
  }

以上這段程式碼,意思就是,如果名不為java的話,那麼就丟擲InvalidNameException()這個異常,於是我們就可以成功的捕捉這個異常,併發出提示或警告。這樣構造一個強大的錯誤處理集合就可以對程式內部或外部進行錯誤處理。

二 key/values方式.

  根據查詢相應的錯誤資訊,並顯示給使用者,的錯誤處理方式就採用了這個(其實我說的二種都採用了)。首先看一下以下程式碼:

ErrorMessage error=new ErrorMessage();
if(!username.equals(“java”)){
  error.add(“ERROR.LOGIN.USERNAME.FAILED”);
}

  建立一個ErrorMessage對錯誤進行處理,如果返回空的error對像的話,說明沒有錯誤,如果返回一個非空的error對像,那麼就跳轉到error.頁面,並捕捉這個錯誤。

錯誤資訊配置檔案:

LOGIN = 使用者登陸

ERROR.LOGIN.EMPTY_INPUT = 登陸失敗:無效輸入!

ERROR.LOGIN.EMPTY_INPUT.DESC = 可能輸入了空值或其他字元。

ERROR.LOGIN.USERNAME.FAILED = 使用者名稱錯誤

ERROR.LOGIN.USERNAME.DESC = 請後退重試,檢查您的使用者名稱是否輸入正確!

以上兩種方式結合於log4j一起使用,可以達到對錯誤處理的要求,我的思想就是在層,如方法內,丟擲異常處理,在表現層對使用者輸入和相關處理用key/values方式處理,這種方式我以前在寫程式的時候就在用,現在又搬出來希望能聽到回覆的,討論一下,看一看有沒有更好的解決方式,由於本人水平有限,目前的錯誤處理設計依然是基於這個去做的。

歡迎討論:biggie@designac.com

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982208/,如需轉載,請註明出處,否則將追究法律責任。

相關文章