6 | 如何设计错误捕捉程序 | 难度系数 êêê |
人气指数 95% |
问题详述
在编译成可执行程序后,如何捕捉到出现错误行的代码以及错误编号和错误信息?Visual FoxPro自身提供的错误提示信息实在太少,给分析错误原因带来很大的麻烦。并且不能建立错误日志文件,这在一些大型项目开发中是不允许的。
专家解答
1.几个比较重要的错误信息函数
ERROR()、MESSAGE()、PROGRAM()和LINENO(),函数的具体使用方法请参见相关帮助文档或本书所附光盘的“帮助手册”。
2.设计自己的错误捕捉程序
在了解了Visual FoxPro的错误捕捉函数后,就可以设计自己的错误捕捉程序了,这个错误捕捉程序在主程序中使用如下格式调用。
ON ERROR DO Err.PRG ;
WITH ERROR(), ;
MESSAGE(), ;
MESSAGE(1), ;
PROGRAM(), ;
LINENO(1)
下面是错误捕捉程序Err.prg的代码。
PARAMETERS nError,cMessage,cMessage1,cProgram,nLineno &&接收参数
SET TEXTMERGE DELIMITERS TO &&指定文本合并分隔符为"<<"和">>"
SET TEXTMERGE ON &&对文本合并分隔符括起的字段、变量、函数等进行计算
SET TEXTMERGE TO ErrorLog.txt ADDITIVE NOSHOW &&设置为追加到文件尾
\---------------------------------------------------------------------
\<<DATE( )>> <<TIME( )>> 错误记录
\程序标题: <<_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))>>
\执行程序所在目录磁盘空间: <<DISKSPACE(JUSTDRIVE(SYS(16,1)))>>
\
\默认目录: <<SYS(5)>><<SYS(2003)>>
\默认目录磁盘空间: <<DISKSPACE(SYS(5))>>
\文件搜寻路径: <<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.Caption") = "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
\
\错误代号: <<nError>>
\错误信息: <<cMessage>>
\产生错误的位置: <<cProgram>>
\所在行号: <<nLineno>>
\产生错误的代码: <<cMessage1>>
\
\输出内存使用情况 -> 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(13)+CHR(13)+;
"错误代号: " + LTRIM( STR(nError) ) + CHR(13) + ;
"错误行号: " + LTRIM( STR(nLineno) ) + CHR(13) + ;
"错误信息: " + cMessage + CHR(13) + ;
"错误代码: " + cMessage1 + CHR(13) + ;
"错误位置: " + cProgram + CHR(13) + CHR(13) + ;
"该错误已经记录到文件:Errorlog.txt,Memorylog.txt,Statuslog.txt。";
,2+48,"信息")
DO CASE
CASE nValue=3 &&选择终止时发生
QUIT
CASE nValue=4 &&选择重试时发生
RETRY
CASE nValue=5 &&选择忽略时发生
RETURN
ENDCASE
当Visual FoxPro检测到错误发生时,会自动调用这个错误处理程序,如图1-7所示。
图1-7 错误捕捉程序捕捉到的信息
并同时把详细的错误信息记录到ErrorLog.txt错误日志文件中,在Visual FoxPro的命令窗口中输入Modify File ErrorLog.txt,如图1-8所示。
但是对于某些错误,Visual FoxPro也捕捉到了,但是并没有触发ON ERROR指定的错误处理程序来记录错误信息。Visual FoxPro提供了一个更加强大的错误捕捉函数AERROR(),其作用是创建一个内存变量数组,数组中包含最近的Visual FoxPro、OLE或ODBC的错误信息,详细的使用说明如下:
l 语法
AERROR(ArrayName)
l 参数
ArrayName
指定AERROR()函数创建的数组名。
l 返回值类型
数值型。
l 说明
AERROR()函数创建的数组有7列,并且返回数组的行数。行数由产生的错误类型决定。表1-1描述了Visual FoxPro产生错误时数组中每个元素的内容。当发生Visual FoxPro错误时,数组只有一行。
图1-8 错误日志文件ErrorLog.txt
表1-1 发生Visual FoxPro错误时AERROR()函数创建的数组元素
元素编号 | 说 明 |
1 | 数值型,这是一个错误编号,与ERROR()函数返回的值相同 |
2 | 字符型,错误文本信息,与MESSAGE()函数返回的值相同 |
3 | Null值,但是如果错误具有附加错误参数,则包含错误参数的文本信息,与SYS(2018) 的返回值相同 |
4 | Null值,但是在适当的时候,包含发生错误的工作区编号 |
5 | Null值,但是当触发失败时(错误 1539),包含下列数值之一: 1-插入触发失败 2-更新触发失败 3-删除触发失败 |
6 | Null值 |
7 | Null值 |
表1-2描述了发生OLE错误1427和1429时各元素的内容。当这些OLE错误发生时,数组只有一行。
表1-2 发生OLE错误时AERROR( )函数创建的数组元素
元素编号 | 说 明 |
1 | 数值型,为1427或1429 |
2 | 字符型,Visual FoxPro的错误信息文本 |
3 | 字符型,OLE错误信息文本 |
4 | 字符型,应用程序名(例如,Microsoft Excel) |
5 | Null值或字符,如果能从应用程序的帮助文件中得到更详细的有关错误的信息,则此处包含应用程序中保存这些信息的帮助文件名,否则为Null值 |
6 | 如果能从应用程序中得到有关信息,此处存放相应帮助主题的帮助文本中的主题标识,否则为Null值 |
7 | 数值型,OLE 2.0的异常数值 |
表1-3描述了发生ODBC错误1526时各元素的内容。当发生ODBC错误时,数组可能包含两行或更多行,每一行为一个ODBC错误。
表1-3 发生ODBC错误时AERROR( )函数创建的数组元素
元素编号 | 说 明 |
1 | 数值型,为1526 |
2 | 字符型,错误信息文本 |
3 | 字符型,ODBC错误信息文本 |
4 | 字符型,当前的ODBC SQL状态 |
5 | 数值型,ODBC数据源的错误编号 |
6 | 数值,ODBC连接句柄 |
7 |