天天看點

PB報錯處理程式

系統錯誤提示視窗

軟體有時會因為人為操作的原因或程式本身漏洞的原因或者其它原因出現錯誤,這時PB的提示資訊是英文的,對于我們使用中文的人來說,這肯定會是件非常頭痛的事件,而且會有損良好的人機互動界面……

是以接下來先制作一個系統出錯時的提示視窗,這樣在設計和調試程式時有許多錯誤可以通過提示視窗中文化資訊看到。

①首先,先制作一個“資料視窗(DataWindow)”,在“建立視窗”中選擇“DataWindow”項,選擇“FreeForm”,點選“OK”按鈕,在接下來的視窗中選擇“External”,按“Next”,在下面這個視窗中,需要設計5個變量(如下圖表:)

字段變量名 變量類型 變量大小 中文含義
Err_number String 10 錯誤号
Err_message 255 錯誤資訊
Err_where 出錯視窗/菜單
Err_object 出錯對象
Err_event 出錯事件
Err_line string 出錯代碼行
PB報錯處理程式

在下一個視窗中選擇“BackgroundColor”為“ButtonFace”,“Text”項的“Border”為“Raised”,點選“next”,然後點選“Finish”,進入資料視窗設計視窗中,調整相應的屬性設定(如下圖:)。

PB報錯處理程式

調整完成後儲存為“d_system_error”。

②接下來可以制作“系統錯誤提示視窗”了。

建立一個視窗,設定如下的一些視窗屬性:

Title(标題):系統錯誤提示

WindowType(視窗類型):Response!

然後在視窗上放置如下控件:

⑴1個GroupBox:清空其Text屬性内容

⑵2個StaticText:st_1.Text=“警告:”;

St_2.Text=“系統出現錯誤,請點選“顯示資訊”檢視具體錯誤資訊,并告知系統管理者!”

⑶1個DataWindow:name屬性=“dw_error”,dw_error.DataObject=“d_system_error”,調整高寬大小,放置位置在GroupBox組框中,不選Border屬性框,并取消Visible選擇框的選擇。

⑷4個CommandButton:

a.Name:cb_showText:“顯示資訊”

ClickedEvent:

IFThis.Text='顯示資訊'THEN

dw_error.Visible=True

This.Text='隐藏資訊'

ELSE

dw_error.Visible=False

This.Text='顯示資訊'

ENDIF

b.Name:cb_printText:“列印資訊”

//列印錯誤資訊

dw_error.print()

c.Name:cb_continueText:“繼續執行”

//關閉提示視窗

Close(Parent)

d.Naem:cb_haltText:“終止系統”

//終止程式執行

HaltClose;

各控件布局如下圖所示:

PB報錯處理程式

-----

系統錯誤提示視窗Open事件代碼:

Stringls_ErrMsg

Stringls_log_file,ls_text

Integerli_file_no

IfError.Number=0ThenReturn

ChooseCaseError.Number

Case1

ls_ErrMsg='除數為零'

Case2

ls_ErrMsg='引用空對象'

Case3

ls_ErrMsg='數組越界'

Case4

ls_ErrMsg='枚舉值超出函數範圍'

Case5

ls_ErrMsg="函數中遇到負值"

Case6

ls_ErrMsg="指定的資料視窗行/列無效"

Case7

ls_ErrMsg="聯接引用時,出現不可解決的外部引用"

Case8

ls_ErrMsg="引用帶有空下标的數組"

Case9

ls_ErrMsg="DLL函數未在目前程式中"

Case10

ls_ErrMsg="DLL函數不支援的參數類型"

Case11

ls_ErrMsg="對象檔案已過期,必須轉化為目前版本"

Case12

ls_ErrMsg="資料視窗列類型與GetItem類型不比對"

Case13

ls_ErrMsg="不可知的屬性引用"

Case14

ls_ErrMsg="為外部函數打開錯誤DLL庫"

Case15

ls_ErrMsg="錯誤調用外部函數"

Case16

ls_ErrMsg="超出最大字元串的長度"

Case17

ls_ErrMsg="資料視窗控件中引用的資料視窗對象不存在"

Case18

ls_ErrMsg="函數未傳回值"

Case19

ls_ErrMsg="不能将任意變量中NAME轉化為NAME"

Case20

ls_ErrMsg="沒有成功地準備好資料庫指令"

Case21

ls_ErrMsg="運作時,不正确地引用函數"

Case22

ls_ErrMsg="不可知的對象類型"

Case23

ls_ErrMsg="不能将NAME類型的對象指派為NAME類型的對象"

Case24

ls_ErrMsg="函數調用與其定義不比對"

Case25

ls_ErrMsg="DOUBLE或REAL表達式溢出"

Case26

ls_ErrMsg="不支援對NAME字段的指派"

Case27

ls_ErrMsg="非整型指數不能為負"

Case28

ls_ErrMsg="VBX錯誤:NAME"

Case29

ls_ErrMsg="ANY變量需要非整組值"

Case30

ls_ErrMsg="外部對象不支援資料類型:NAME"

Case31

ls_ErrMsg="不支援外部對象資料類型:NAME"

Case32

ls_ErrMsg="調用外部對象函數NAME時,未找到名字"

Case33

ls_ErrMsg="調用外部對象函數NAME時,參數類型不合法"

Case34

ls_ErrMsg="調用外部對象函數NAME時,使用不正确的參數數目"

Case35

ls_ErrMsg="錯誤調用外部對象函數NAME"

Case36

ls_ErrMsg="通路外部對象屬性NAME時,未找到名稱"

Case37

ls_ErrMsg="通路外部對象屬性NAME時,類型不比對"

Case38

ls_ErrMsg="詢問外部對象屬性NAME時,下标數目不正确"

Case39

ls_ErrMsg="錯誤通路外部對象屬性NAME"

Case40

ls_ErrMsg="與表達式中任意資料類型不比對"

Case41

ls_ErrMsg="表達式中有不合法的任意資料類型"

Case42

ls_ErrMsg="在DLL函數NAME中,運作時所指定的參數類型與所要求的參數類型不相同"

Case43

ls_ErrMsg="父對象不存在"

Case44

ls_ErrMsg="祖先的函數中具有發生沖突的參數及傳回類型"

Case45

ls_ErrMsg="外部表溢出"

Case46

ls_ErrMsg="空的對象引用不能被指派或傳遞給同類型的變量"

Case47

ls_ErrMsg="變量需要數組值"

Case48

ls_ErrMsg="數組的大小與對象的轉換不比對"

Case49

ls_ErrMsg="數組的類型與對象的轉換不比對"

Case50

ls_ErrMsg="分布服務錯誤"

Case51

ls_ErrMsg="函數或事件的參數不合法"

Case52

ls_ErrMsg="分布通訊錯誤"

Case53

ls_ErrMsg="未激活所需伺服器"

Case54

ls_ErrMsg="伺服器未接受請求"

Case55

ls_ErrMsg="請求非正常終止"

Case56

ls_ErrMsg="非完整地相應請求"

Case57

ls_ErrMsg="未聯接"

Case58

ls_ErrMsg="對象執行個體不存在"

Case59

ls_ErrMsg="不合法的列範圍"

Case60

ls_ErrMsg="不合法的行範圍"

Case61

ls_ErrMsg="将NUMBER維數組不合法地轉換成對象"

Case62

ls_ErrMsg="伺服器忙"

Case63

ls_ErrMsg="無傳回值的函數或事件用于表達式"

Case64

ls_ErrMsg="指派需要數組對象"

CaseElse

ls_ErrMsg="其他錯誤"

EndChoose

//将錯誤資訊增加到dw_error中

dw_error.InsertRow(0)

dw_error.SetItem(1,'err_number',String(Error.Number))

dw_error.SetItem(1,'err_message',ls_ErrMsg)

dw_error.SetItem(1,'err_where',Error.WindowMenu)

dw_error.SetItem(1,'err_event',Error.ObjectEvent)

dw_error.SetItem(1,'err_object',Error.Object)

dw_error.SetItem(1,'err_line',String(Error.Line))

//以下代碼段将錯誤号和錯誤資訊寫進日志檔案syserror.log中

ls_text="~r~n----------------------------------------------------------------"

ls_text+="~r~n"

ls_text+="~r~n出錯時間:"+String(Today(),'yyyy/mm/dd')+""+String(Now())

//ls_text+="~r~n操作員:"+gs_user_name

ls_text+="~r~n錯誤代碼:"+String(Error.Number)

ls_text+="~r~n錯誤資訊:"+ls_ErrMsg

ls_text+="~r~n視窗/菜單:"+Error.WindowMenu

ls_text+="~r~n出錯控件:"+Error.Object

ls_text+="~r~n出錯事件:"+Error.ObjectEvent

ls_text+="~r~n出錯行數:"+String(Error.Line)

//打開系統錯誤日志檔案

IfTrim(ls_log_file)=""ORIsNull(ls_log_file)Then

ls_log_file="syserror.log"

EndIf

li_file_no=FileOpen(ls_log_file,LineMode!,Write!,SHARED!,Append!)

Ifli_file_no=0Then

MessageBox("出錯資訊","不能打開系統出錯日志檔案!",Exclamation!)

Else

IfFileWrite(li_file_no,ls_text)<0Then

MessageBox("出錯資訊","寫系統出錯日志檔案出錯!",Exclamation!)

将視窗儲存為“w_system_error”。