添加全局错误处理程序

在 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

会这样做。