如何用 ON ERROR 來調(diào)試應(yīng)用程序 FoxPro 提供了 ON ERROR 命令來允許編程者捕捉應(yīng)用程序中出現(xiàn)的特定錯誤. 本文說明如何使用一個錯誤捕捉例程保存有關(guān)的調(diào)試信息到一個 FoxPro 表中. 本文中的代碼捕捉出現(xiàn)在 FoxPro 應(yīng)用程序中的錯誤并保存以下信息到一個表中: · 錯誤出現(xiàn)的計算機(jī)名. · 錯誤號. · 錯誤信息. · 如果源代碼可用, 發(fā)生錯誤的源代碼. · 發(fā)生錯誤的程序. · 發(fā)生錯誤的行號. · 錯誤發(fā)生時最近選定的表. · 錯誤的日期和時間. 應(yīng)用程序中的錯誤的語法和邏輯會產(chǎn)生許多可捕捉錯誤. 有些出現(xiàn)在應(yīng)用程序中的錯誤在被最終用戶測試前是不可知的. 當(dāng)默認(rèn)的 FoxPro 錯誤信息顯示對于程序員來說是有用的信息時, 它的出現(xiàn)可能會使最終用戶糊涂. 同樣, 當(dāng)應(yīng)用程序執(zhí)行時, 最終用戶通常很少有時間小心的注意并報告錯誤的出現(xiàn). 在沒有人提供錯誤報告時, 這些代碼也有助于檢驗斷斷續(xù)續(xù)出現(xiàn)的錯誤的原因.
用以下代碼創(chuàng)建一個叫做 Errutil.prg 和程序.
ON ERROR DO errhand IN errutil ; WITH SYS(0), ERROR(), MESSAGE(), MESSAGE(1), ; PROGRAM(), LINENO(1), DBF(), DATE(), TIME() * 錯誤捕捉設(shè)置結(jié)束.
PROCEDURE errhand PARAMETER m.machine, m.messgnum, m.messg, m.linecode, ; m.callprog, m.inline, m.OPENTABL, m.errdate, ; m.errtime m.errspace=SELECT() && 保存當(dāng)前工作區(qū).
m.errorder=ORDER() && 保存當(dāng)前排序.
IF LEN(ALLTRIM(m.callprog))=0 m.callprog="Command Line" STORE SPACE(0) TO m.linecode ENDIF outmsgline="錯誤 ; "+m.messg+CHR(13)+"行號 "+STR(m.inline)+ ; CHR(13)+ ; "程序名 = "+m.callprog+CHR(13)+"語法 :"+m.linecode * Visual FoxPro 用戶使用 =MESSAGEBOX(outmsgline,32+0) * FoxPro For Windows 用戶使用 Foxtools.fll 中的 MsgBox()
函數(shù) WAIT WINDOW outmsgline TIMEOUT 5 && 所有版本均可使用該語法.
IF !USED("ERRORLOG") IF FILE("ERRORLOG.DBF") SELECT 0 USE errorlog ELSE SELECT 0 thisversion=VERSION() IF LEFT(ALLTRIM(thisversion),6)="Visual" * 為 Visual FoxPro 版本創(chuàng)建一個自由表
CREATE TABLE errorlog FREE (machine c(20), messgnum N(4,0), ; messg c(70), linecode c(70), callprog c(40), ; inline N(6,0), OPENTABL c(25), errdate d, errtime c(8)) ELSE CREATE TABLE errorlog (machine c(20), messgnum N(4,0), ; messg c(70), linecode c(70), callprog c(40), ; inline N(6,0), OPENTABL c(25), errdate d, errtime c(8)) ENDIF ENDIF ENDIF INSERT INTO errorlog FROM MEMVAR SELECT errorlog && 選擇 errorlog 表. USE && 關(guān)閉 errorlog 表. SELECT (m.errspace) && 返回到保存的工作區(qū).
IF !EMPTY(ALIAS()) SET ORDER TO (m.errorder) ENDIF RELEASE ALL LIKE m.messgnum, m.messg, m.linecode, m.callprog, ; m.inline RETURN 用以下代碼創(chuàng)建一個名為 Ztest.prg 的程序: DO errutil && 激活 Errutil.prg 中的 ON ERROR 例程. USE c:\noexist.dbf && 因為該文件尚不存在因此會發(fā)生錯誤 DO C:\noexist.prg ON ERROR && 關(guān)閉活動的 ON ERROR 例程. 在 Visual FoxPro 命令窗口中打入以下命令: Do ZTest.prg. 兩個 Wait 窗口顯示出不愉快的錯誤代碼行. 這些信息被放入 Errorlog.dbf 文件中. 5 秒鐘后窗口消失. 激活命令窗口, 然后打開并瀏覽 Errorlog 表.