6.如何设计错误捕捉程序
来源:互联网 发布:淘宝客网站搭建 编辑:程序博客网 时间:2024/04/29 19:51
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
Null值
AERROR()函数具备了存储多行错误信息的功能,对于保留ODBC错误信息更为有利,但是在ODBC出现连接错误等现象时,却不会触发ON ERROR设定的错误捕捉程序,下面通过SQLConnect()函数来建立一个到SQL服务器的连接,SQLCONNECT()函数会返回一个连接句柄。如果连接成功,句柄会是一个正整数。如果 Visual FoxPro 建立连接失败,句柄会包含一个负数,Visual FoxPro对远程数据源返回1526错误。现在使用一个未在SQL Server中注册的用户建立连接,故意产生一个错误,假设在ODBC管理器中已经建立了一个到SQL Server的pubs数据库名为ODBCpubs的数据源。代码如下:
#DEFINE MB_OKBUTTON 0
#DEFINE MB_STOPSIGNICON 16
ON ERROR DO Err.PRG ;
WITH ERROR(), ;
MESSAGE(), ;
MESSAGE(1), ;
PROGRAM(), ;
LINENO(1) &&设定错误捕捉
=SQLSETPROP(0,'DispLogin',3)
LOCAL hConn
hConn = SQLCONNECT("ODBCPubs", "bad_user", "")
IF (hConn < 0) &&如果连接错误
=AERROR(laError)
DO WriteODBCErr.prg &&把错误记录到ErrorLog.txt日志中
=MESSAGEBOX( laError[2], ;
MB_OKBUTTON + MB_STOPSIGNICON, ;
"Error " + TRANSFORM(laError[1]))
ENDIF
注意上面代码中的“=SQLSETPROP(0,'DispLogin',3)”语句,该语句用于设置不显示“ODBC 注册”对话框,并且当所需要注册的内容不可用时,Visual FoxPro产生一个错误。执行这段代码,会发现并没有触发错误捕捉Err.PRG程序,而是直接到了IF (hConn<0)这里,使用连接句柄判断错误的发生,如图1-9所示。
图1-9 使用未在SQL Server上注册的用户登录时产生的错误
在WriteODBCErr.prg中使用了一个FOR…ENDFOR语句,用来记录ODBC可能产生的多条错误,代码如下:
SET TEXTMERGE DELIMITERS TO
SET TEXTMERGE ON
SET TEXTMERGE TO ErrorLog.txt ADDITIVE NOSHOW
/---------------------------------------------------------------------
/<<DATE( )>> <<TIME( )>> ODBC错误记录
nErrLine=AERROR(laErr)
FOR n=1 TO nErrLine
/错误编号: <<laErr(n,1)>>
/错误信息: <<laErr(n,2)>>
/ODBC信息: <<laErr(n,3)>>
/ODBC SQL 状态: <<laErr(n,4)>>
/ODBC 数据源错误编号: <<laErr(n,5)>>
/ODBC 连接句柄: <<laErr(n,6)>>
/
/---------------------------------------------------------------------
ENDFOR
SET TEXTMERGE TO
所以,在编写客户/服务器程序的时候,一定要注意使用连接句柄来捕获错误,不要妄想Visual FoxPro的ON ERROR会为你做些什么!
专家点评
在本题中,制作了两个非常棒的错误捕捉记录程序,讨论了Visual FoxPro在错误捕捉方面存在的缺陷,在进行客户/服务器开发中,这两个错误捕捉都是必需的。在进行错误记录中,使用了大量的系统函数,如:SYS(2003)、SYS(1001)、SYS(1271)、SYS(5)等,以及文件操作函数,如:JUSTPATH()、JUSTFNAME()、JUSTDRIVE()、JUSTTEXT()以及JUSTSTEM()等,都是非常有用的,关于这些函数可以参考Visual FoxPro的帮助文件。
- 6.如何设计错误捕捉程序
- 悬而未决:如何捕捉warning错误?
- 捕捉段错误信号信号处理程序
- 程序错误日志捕捉,存储本地
- 如何捕捉控制台程序的关闭事件
- 如何捕捉控制台程序的关闭事件
- 错误捕捉
- //捕捉段错误信号的信号处理程序
- 在SQL Server中如何进行错误捕捉
- 程序如何捕捉signal函数参数中指定的信号
- 如何捕捉程序异常/crash 并生成 dump 文件
- sql2005 中捕捉错误
- 错误捕捉方案
- Opencv 错误捕捉
- openCV错误捕捉
- LotusScript捕捉错误
- Linux错误捕捉
- 设置NSZombieEnabled捕捉错误
- 4.如何隐藏Visual FoxPro的主窗口
- 关于杨辉三角的分析
- ubuntu netbook remix里窗口总是自动最大化,怎么办?
- 5.如何处理“不能退出FoxPro”的情况
- 使用qsort对二维字符数组排序疑难问题调试及解决过程
- 6.如何设计错误捕捉程序
- intel集成显卡在ubuntu 9.04下性能不佳的解决方法
- WindowsMobile可用的三种数据同步
- truncate报ORA-02266错“唯一/主键被启用的外部关键字引用”解决方法
- ExitThread()
- 利用timestamp实现数据库处理同一记录的时间差异问题
- 指令周期 机器周期 状态周期 振荡时钟周期(时钟周期)
- somethings basic for bapi badi and user exit
- 理解Oracle的优化器