作者:達通興電腦科技公司(www.study01job.com) 郭寶利
在一個應用程式中,不管什麼時候發生錯誤,都可以觸發Application對象的SystemError事件(個別的,資料視窗的DBError、ItemError事件不會觸發SystemError,以後再討論),在該事件中可以處理全域對象Error的資訊,以便使用者清楚錯誤的情況,並且還有機會繼續執行程式,否則整個應用可能就會關閉了。
程式設計思路很簡單,只要在Application對象的SystemError事件中開啟一個公用的錯誤處理視窗就可以了。錯誤處理視窗顯示錯誤資訊,並且提供‘繼續’還是‘中斷’的選擇。可以設計一個External類型的資料視窗,用來顯示這些錯誤資訊。這裡提供的程式比較實用的一點是,將PB所有能夠被SystemError捕獲的錯誤都翻譯成了漢語,這點我相信比較受中國使用者的歡迎,讀者可以拿來直接使用。錯誤資訊顯示視窗的程式如下:
String ls_ErrMsg
Choose Case error.number
Case 1
ls_ErrMsg = "被零除"
Case 2
ls_ErrMsg = "引用Null 物件"
Case 3
ls_ErrMsg = "數組越界"
Case 4
ls_ErrMsg = "枚舉值超出函數範圍"
Case 5
ls_ErrMsg = "函數中遇到負值"
Case 6
ls_ErrMsg = "指定的資料視窗行/列無效"
Case 7
ls_ErrMsg = "聯結引用時,出現不可解決的外部參考"
Case 8
ls_ErrMsg = "引用帶有空下標的數組"
Case 9
ls_ErrMsg = "DLL函數未在當前程式中"
Case 10
ls_ErrMsg = "DLL函數不支援的參數類型"
Case 11
ls_ErrMsg = "對象檔案已到期,必須轉化為目前的版本"
Case 12
ls_ErrMsg = "資料視窗列類型與GetItem類型不符"
Case 13
ls_ErrMsg = "不可知的屬性引用"
Case 14
ls_ErrMsg = "為外部函數開啟錯誤DLL庫"
Case 15
ls_ErrMsg = "錯誤調用外部函數"
Case 16
ls_ErrMsg = "超出最大字串的長度"
Case 17
ls_ErrMsg = "資料視窗控制項中引用的資料視窗對象不存在"
Case 18
ls_ErrMsg = "函數未傳回值"
Case 19
ls_ErrMsg = "不能將任意變數中NAME轉化為NAME"
Case 20
ls_ErrMsg = "沒有成功地準備好資料庫命令"
Case 21
ls_ErrMsg = "運行時,不正確地引用函數"
Case 22
ls_ErrMsg = "不可知的物件類型"
Case 23
ls_ErrMsg = "不能將NAME類型的對象賦值為NAME類型的對象"
Case 24
ls_ErrMsg = "函數調用與其定義不匹配"
Case 25
ls_ErrMsg = "DOUBLE或REAL運算式溢出"
Case 26
ls_ErrMsg = "不支援對NAME欄位的賦值"
Case 27
ls_ErrMsg = "非整型指數不能為負"
Case 28
ls_ErrMsg = "VBX錯誤:NAME"
Case 29
ls_ErrMsg = "ANY變數需要非整組值"
Case 30
ls_ErrMsg = "外部對象不支援資料類型:NAME"
Case 31
ls_ErrMsg = "不支援外部對象資料類型:NAME"
Case 32
ls_ErrMsg = "調用外部對象函數NAME時,未找到名字"
Case 33
ls_ErrMsg = "調用外部對象函數NAME時,參數類型不合法"
Case 34
ls_ErrMsg = "調用外部對象函數NAME時,使用不正確的參數數目"
Case 35
ls_ErrMsg = "錯誤調用外部對象函數NAME"
Case 36
ls_ErrMsg = "訪問外部對象屬性NAME時,未找到名稱"
Case 37
ls_ErrMsg = "訪問外部對象屬性NAME時,類型不符"
Case 38
ls_ErrMsg = "詢問外部對象屬性NAME時,下標數目不正確"
Case 39
ls_ErrMsg = "錯誤訪問外部對象屬性NAME"
Case 40
ls_ErrMsg = "與運算式中任意資料類型不匹配"
Case 41
ls_ErrMsg = "運算式中有不合法的任意資料類型"
Case 42
ls_ErrMsg = "在DLL函數NAME中,運行時所指定的參數類型與所要求的參數類型不相同"
Case 43
ls_ErrMsg = "父物件不存在"
Case 44
ls_ErrMsg = "祖先的函數中具有發生衝突的參數及傳回型別"
Case 45
ls_ErrMsg = "外部表格溢出"
Case 46
ls_ErrMsg = "空的對象引用不能被賦值或傳遞給同類型的變數"
Case 47
ls_ErrMsg = "變數需要數組值"
Case 48
ls_ErrMsg = "數組的大小與對象的轉換不匹配"
Case 49
ls_ErrMsg = "數組的類型與對象的轉換不匹配"
Case 50
ls_ErrMsg = "分布服務錯誤"
Case 51
ls_ErrMsg = "函數或事件的參數不合法"
Case 52
ls_ErrMsg = "分布通訊錯誤"
Case 53
ls_ErrMsg = "未啟用所需伺服器"
Case 54
ls_ErrMsg = "伺服器未接受請求"
Case 55
ls_ErrMsg = "請求非正常終止"
Case 56
ls_ErrMsg = "非完整地相應請求"
Case 57
ls_ErrMsg = "未聯結"
Case 58
ls_ErrMsg = "對象執行個體不存在"
Case 59
ls_ErrMsg = "不合法的列範圍"
Case 60
ls_ErrMsg = "不合法的行範圍"
Case 61
ls_ErrMsg = "將NUMBER維數組不合法地轉換成對象"
Case 62
ls_ErrMsg = "伺服器忙"
Case 63
ls_ErrMsg = "無傳回值的函數或事件用於運算式"
Case 64
ls_ErrMsg = "賦值需要數組對象"
Case Else
ls_ErrMsg = "其他錯誤"
End Choose
dw_error.insertrow (0)
dw_error.setitem (1,"errornum",string(error.number))
dw_error.setitem (1,"message" ,ls_ErrMsg)
dw_error.setitem (1,"where" ,error.windowmenu)
dw_error.setitem (1,"object" ,error.object)
dw_error.setitem (1,"event" ,error.objectevent)
dw_error.setitem (1,"line" ,string(error.line))