新增全域性錯誤處理程式

在 VFP 應用程式中捕獲未處理錯誤(異常)的一種簡單方法是在主程式開頭附近使用 ON ERROR 命令。

以下 ON ERROR 命令呼叫當前程式中名為 errorHandler 的方法。ERROR(VFP 錯誤號),MESSAGE(VFP 錯誤訊息),PROGRAM(當前正在執行的程式的名稱)和 LINENO(錯誤的行號)返回的值將傳遞給 errorHandler 方法。

ON ERROR DO errorHandler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()

一個簡單的 errorHandler 方法可能如下所示。

PROCEDURE errorHandler
    LPARAMETERS tnVFPErrorNumber, tcVFPErrorMessage, tcProcWithError, tnLineNumber

    STORE 'Error message: ' + tcVFPErrorMessage + CHR(13) + ;
        'Error number: ' + TRANSFORM(tnVFPErrorNumber) + CHR(13) + ;
        'Procedure with error: ' + tcProcWithError + CHR(13) + ;
        'Line number of error: ' + TRANSFORM(tnLineNumber) TO lcDetails

    MESSAGEBOX(lcDetails, 16, "Unhandled Exception")

    ON ERROR *
    ON SHUTDOWN
    CLEAR EVENTS

    QUIT
ENDPROC

你還可以在其間更改和還原錯誤處理程式。例如,你希望在某一時刻以獨佔方式開啟資料夾中的所有表,如果你不能,則不想繼續:

procedure DoSomethingWithExclusiveLock(tcFolder)
local lcOldError, llInUse, ix && by default these variables have a value of .F.
lcError = on('error') && save current handler
on error llInUse = .T.  && new handler
local array laTables[1]  
for ix=1 to adir(laTables, addbs(m.tcFolder) + '*.dbf'))
   use (addbs(m.tcFolder)+laTables[m.ix,1]) in 0 exclusive
endfor
on error &lcError && restore old handler
if m.llInUse && couldn't get exclusive lock on all tables
   close databases all
   return
endif
* do whatever
endproc

提示:有時候,特別是在除錯期間,你需要恢復預設錯誤處理程式,它允許你中斷並進入發生錯誤的程式碼,然後在出現錯誤之前的任何地方,臨時新增:

on error

會這樣做。