将以下代码存入一个Prg文件,如:MyFunction.Prg
*====================================================
*作 用:写错误到日志ErrorLog.txt,并显示错误信息
*语 法:MyWriteShowErr(n错误代号,c错误信息,c错误代码,c错误位置,n错误行号)
*参数说明:ERROR(),MESSAGE(),MESSAGE(1),PROGRAM(),LINENO(1)
*返 回 值:无,直接写入日志文件并显示了错误信息
*====================================================
FUNCTION MyWriteShowErr
PARAMETERS tnError,tcMessage,tcMessage1,tcProgram,tnLineno
SET TEXTMERGE DELIMITERS TO
SET TEXTMERGE ON
SET TEXTMERGE TO ErrorLog.txt ADDITIVE NOSHOW
\-----------------------------------------------
\<<DATETIME()>>
\程序标题:<<_SCREEN.Caption>>
\程序开发版本:<<VERSION(1)>>
DO CASE
CASE _SCREEN.WINDOWSTATE= 0
\窗口状态:普通
CASE _SCREEN.WINDOWSTATE= 1
\窗口状态:最小化
CASE _SCREEN.WINDOWSTATE= 2
\窗口状态:最大化
ENDCASE
\窗口可视:<<IIF(_SCREEN.Visible= .T.,'可见','不可见')>>
\窗口集合数:<<_SCREEN.FormCount>>
\网络机器信息:<<SYS(0)>>
\
\执行程序:<<JUSTFNAME(SYS(16,1))>>
\执行程序所在目录:<<JUSTPATH(SYS(16,1))>>
\执行程序所在目录磁盘可用空间:<<LTRIM(TRANSFORM(DISKSPACE(JUSTDRIVE(SYS(16,1))),'999,999,999,999,999'))>>
\
\默认目录:<<SYS(5)>><<SYS(2003)>>
\默认目录磁盘可用空间:<<LTRIM(TRANSFORM(DISKSPACE(SYS(5)),'999,999,999,999,999'))>>
\文件搜寻路径:<<SET('PATH')>>
\
\系统临时目录:<<SYS(2023)>>
\虚拟内存池大小:<<SYS(1001)>>
\
\正在使用的工作区:<<ALIAS()>>
\活动字段:<<VARREAD()>>
\
IF TYPE('_SCREEN.ACTIVEFORM.NAME')='C'
\活动表单:<<_SCREEN.ActiveForm.NAME>>
\表单标题:<<_SCREEN.ActiveForm.CAPTION>>
\表单基类:<<_SCREEN.ActiveForm.BASECLASS>>
\表单派生:<<_SCREEN.ActiveForm.CLASS>>
\表单派生库:<<_SCREEN.ActiveForm.CLASSLIBRARY>>
\表单位置:<<SYS(1271,_SCREEN.ActiveForm)>>
ELSE
\无活动表单
ENDIF
IF TYPE('_SCREEN.ACTIVEFORM.ACTIVECONTROL')='O'
\活动控制:<<_SCREEN.ACTIVEFORM.ACTIVECONTROL.NAME>>
IF TYPE('_SCREEN.ACTIVEFORM.ACTIVECONTROL.NAME')='C'
\控制标题:<<_SCREEN.ACTIVEFORM.ACTIVECONTROL.CAPTION>>
ENDIF
\控件基类:<<_SCREEN.ActiveForm.ACTIVECONTROL.BASECLASS>>
\控件派生:<<_SCREEN.ActiveForm.ACTIVECONTROL.CLASS>>
\控件派生库:<<_SCREEN.ActiveForm.ACTIVECONTROL.CLASSLIBRARY>>
\控件位置:<<SYS(1271,_SCREEN.ActiveForm.ACTIVECONTROL)>>
ELSE
\无活动控制
ENDIF
\
\错误代号:<<tnError>>
\错误信息:<<tcMessage>>
\产生错误的位置:<<tcProgram>>
\所在行号:<<tnLineno>>
\产生错误的代码:<<tcMessage1>>
\
\输出内存使用情况 -> MemoryLog.txt
\输出工作环境到 -> StatusLog.txt
SET SAFETY OFF
DISPLAY MEMORY NOCONSOLE TO FILE MemoryLog.txt
DISPLAY STATUS NOCONSOLE TO FILE StatusLog.txt
\
\-----------------------------------------------
SET TEXTMERGE TO
nValue=MESSAGEBOX('程序发生错误!详细信息如下:'+CHR(10)+CHR(10)+;
'错误代号:'+LTRIM(STR(tnError))+CHR(10)+;
'错误行号:'+LTRIM(STR(tnLineno))+CHR(10)+;
'错误信息:'+tcMessage+CHR(10)+;
'错误代码:'+tcMessage1+CHR(10)+;
'错误位置:'+tcProgram+CHR(10)+CHR(10)+;
'该错误已经记录到文件:ErrorLog.txt,MemoryLog.txt,StatusLog.txt。 ';
,2+48,'信息提示')
DO CASE
CASE nValue=3
CLOSE DATABASES ALL
CLOSE ALL
QUIT
CASE nValue=4
RETRY
CASE nValue=5
RETURN
ENDCASE
ENDFUNC
然后在主程序中加设置语句:
SET PROCEDURE TO MyFunction.PRG
ON ERROR MyWriteShowErr(ERROR(),MESSAGE(),MESSAGE(1),PROGRAM(),LINENO(1)) &&捕获、写、显示错误