對錯誤的態度

來源:互聯網
上載者:User
錯誤      近一年來受工作的關係看其他程式員的代碼的機會變多了,學習了不少東西,但同時也發現很多問題,其中我遇到的最多的就是對錯誤的處理態度。
  
  1) 從不攔截錯誤;
  
  這可能是最原始且是最不好的行為,他們總是認為自己的程式肯定100%不會出現問題,因為他們堅信自己的代碼考慮了一切可能的情況,這種理解我認為是非常危險的,翻翻你的代碼,看看是否考慮了以下常見的情況:
  
  l 在只允許輸入數位文字框裡你攔截了鍵盤事件,但使用者用右鍵粘貼了文本後你的程式正常嗎?
  
  l 設定了Locked屬性的文字框使用者一樣可以粘貼,你的程式出問題了嗎?
  
  l 磁碟空間不足、目錄唯讀、沒有許可權、目錄名中有小數點、系統採用了短日期甚至不標準的格式;
  
  l 明明事先檢查了磁碟空間足夠,可使用者偏使用了什麼磁碟配額,還是磁碟空間不足;
  
  l 使用者在你一段長時間的操作工程中等的不耐煩強行關機後重新運行你的這段程式;
  
  l 你是否相信Access資料庫或SQL Server資料庫設定欄位不可為空,但資料庫就會莫名其妙的有NULL值在裡面;
  
  你所想象不到的情況太多了,所以說你永遠不可能考慮所有的情況。
  
  2) 總是攔截錯誤;
  
  這種情況和第一種情況恰恰相反,他會不厭其煩的在每個過程中都添加On Error Goto ,然後出錯的話報一個MsgBox框出來,我相信倆年以上五年以下工作經驗99%的VB程式員基本上都是這麼做的,也許馬上就有人立即站起來說:你剛才還說不可能考慮每一種情況,所以要攔錯,為什麼馬上反悔了呢?這裡我想提出我的第一個重要觀點:
  
  盡量不要封殺任何的底層錯誤。
  
  我們假設有4個過程A,B,C,D,其中A調用了B,B有調用了C,C又調用了D,如果我們在每個子過程中都攔截了錯誤,那麼如果D發生了錯誤,程式將報告發生一個錯誤,顯然這時D退出後,C其後的代碼就不應該執行了,似乎他現在唯一的辦法只有通過D返回False來表示失敗,他才知道底層失敗了,不能繼續執行了,同樣的道理C和B都要返回False來取消任務。
  
  天啦,這豈不是要沒有過程都要寫成返回True和False了,看看你的程式,這可能嗎?而且你將遇到一個非常尷尬的局面,你調用任何一個函數都要這樣調用:
  
  If B = False Then
  
  A = False
  
  Exit Sub
  
  End If
  
  我想你肯定覺得不爽,不僅如此你還有一個致命的問題:最上層的程式(注意是程式而不是使用者)根本不知道底層什麼地方失敗了,什麼原因失敗了,他唯一知道了事就是失敗了!啊,真慘。
  
  既然這樣我們回頭看看底層不攔截錯誤的情況:
  
  Public Sub A()
  
  On Error Goto ErrorHandler
  
  
  B()
  
  'Do some thing
  
  Exit Sub
  
  
  ErrorHandler:
  
  MsgBox(Err.Description)
  
  End Sub
  
  
  Public Sub B()
  
  'Do some thing
  
  C()
  
  End Sub
  
  
  Public Sub C()
  
  'Do some thing
  
  D()
  
  End Sub
  
  
  Public Sub D()
  
  'Do some thing
  
  End Sub
  
  在這裡B、C、D都沒有攔截錯誤,且不需返回是否成功,他們只專註自己所做的工作,且你可以看見的,任何地方出錯都將跳出返回上一級。
  
  所謂錯誤,就是一個完整事務的失敗,不管他是什麼情況。一個資料庫連接失敗是錯誤,一個不符合商業規則的東西也是錯誤,在我們的程式中同樣應該作為錯誤觸發。例如:
  
  If strName = "" Then
  
  Err.Raise(vbObjectError + 23, "Cworker.UpDate", , "名稱不可為空。")
  
  End If
  
  當然我同樣將使用者的取消作為錯誤出來,觸發取消錯誤,例如:
  
  If UserCancel Then
  
  Err.Raise(vbObjectError + 10, "frmWorker.cmdCancel_Click", , "使用者取消操作")
  
  End If
  
  我一般習慣上把錯誤分為致命錯誤、軟硬體錯誤、取消錯誤和商業錯誤。商業錯誤分為:不符合商業規則錯誤、許可權錯誤。
  
  對於程式的錯誤出來分布我一般把所有函數分為:安全函數和不安全函數,比如一個視窗中有十種動作,我首先建立一個RunFunction過程,例如:
  
  Public Sub RunFunction(ByVal vFun As EnumBusinFunction)
  
  這個過程作為所有動作的入口,且統一出來錯誤,這個過程就叫安全函數,因為理論上調用他是不會播發錯誤的,然後所有事件中調用這個函數。在RunFunction函數中所調用的其他函數理論上應該都是不安全函數。
  
  以上是我對錯誤的態度,說的很雜亂,請大家不要介意,我非常希望大家能夠一起談談這個問題。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。