iT邦幫忙

DAY 22
3

程式設計心法系列 第 22

程式設計心法:21.Error Handling

Error Handling 或稱作 Exception Handling,都是在幫我們攔截系統 Runtime 錯誤發生時,所產生的錯誤訊息。(或者為特定目的而 Raise Error)

有了他的協助,我們可以在不影響程式運作的同時,將產生的錯誤做追蹤處理,這對除錯來說是相當有幫助的。更有幫助的是,程式不會而當掉無法執行(當然得看發生錯誤的嚴重程度以及是否能夠由程式 Handle)
好習慣,是在您的程式模組中加上 Exception Handling 的 Block,如:

  Try 
    ' Your Code
  Catch e as ExceptionType
    ' Error Handling
  Finally
    ' Release Object
  End Try

一個程式模組,最好擁有一個 Exception Handling Block,當然也可以有多個,但是追蹤較不容易,可以透過不同的 Error Catch Block 去攔截不同的錯誤型態,如:

  Try 
    ' Your Code
  Catch e as ExceptionTypeI
    ' Error Handling
  Catch e as ExceptionTypeII
    ' Error Handling
  Catch e as ExceptionTypeIII
    ' Error Handling
  Finally
    ' Release Object
  End Try

而作不同的處理。從 Dot Net 開始,VB 都提供同樣的 Exception Handling 模式,算是跟上潮流的腳步。

如果您還是寫 VBA(指 Office 2003,2007 是否改採 .Net 我就沒試過了),那只能這樣處理:

On Error Goto ErrorHandling

  ' Your Code

ExitSub:
  ' Release Object
  Exit Sub
ErrorHandling:
  ' Error Handling
  Resume ExitSub

當然如果您要做到不同錯誤型態的處理,那麼就要借助不同的 Label 來區隔,但用起來 Goto 來 Goto 去的總是不方便就是。

那麼,Error Handling 要處理什麼?這可是個好問題!

您也許會說,很簡單呀!就像這樣:

ErrorHandling:
  msgbox Err.Description

將 VB 內建的錯誤訊息直接顯示出來。也許您會很容易就能掌握著錯誤訊息的資訊,但是,要記得執行程式的人是使用者,告訴他這種錯誤訊息,只會增加使用者的困擾,對他來說並沒有太大的幫助。
但,至少這也是一種處理方式。千萬不要懶惰到,

ErrorHandling:
  msgbox "很抱歉!有錯誤發生!請通知管理人員!"

這跟「有怪獸!有怪獸!」有什麼兩樣!

最好是您將攔截到的錯誤,先做整理與分析,如果是使用者輸入資料的錯誤,那麼就提醒使用者,該輸入什麼資料(當然這寫在 Validation 的部份會比較好),如同上一篇除錯中所提的,您可以將一些資訊加以定義,提供程式編號等訊息傳達給使用者,這樣對使用者的操作經驗,會比較舒服,程式也不是硬梆梆的沒有人味。對開發人員來說,都能達到事半功倍之效。(像 Google Chrome 的錯誤處理機制,就蠻人性化的)

我自己有一個小技巧,就是將攔截到資訊以及程式執行的 Stack Strace Dump 出來,寫到 Log 或直接發 email 出來(待物件導向階段的範例再來說明)。

這一點相當有幫助,那就是在 User 反應問題前,如果我還不了解程式的錯誤原因,我就會先打電話給使用者,問他剛剛是做了什麼動作,他們總是會很驚訝,為什麼我會知道他們發生什麼問題!真的,傑克真是太神奇了!

這樣處理事情真的容易太多了!^^b 使用者會覺得你很親切,然後會鉅細靡遺的告訴你,他們做了什麼事情!其實也不過就是攔截錯誤訊息而已!不過太常發生,也是會讓人起疑的,表示程式寫得有問題...XD

本系列文章


上一篇
程式設計心法:20.除錯(Debug)
下一篇
程式設計心法:22.物件?了了沒?
系列文
程式設計心法31

1 則留言

0
pantc328
iT邦研究生 1 級 ‧ 7 年前

ErrorHandling:
msgbox "很抱歉!有錯誤發生!請通知管理人員!"

上面這二行.我覺得意義也不大.

我的做法.會是在這二行中加一些處理.
比如說將錯誤寫到Client或Server的Log檔或資料庫.
或者用EMail或SMS通知管理人員直接處理.
然後將錯誤訊息改成使用者看得懂得.並Show出錯誤碼.
然後由使用者告訴管理者錯誤碼.管理者至Log或其他地方找出明確的錯誤資訊.
然後進行修護動作.

jamesjan iT邦高手 1 級 ‧ 7 年前 檢舉

^^b

我要留言

立即登入留言