添加全局错误处理程序
在 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
会这样做。