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 FoxProOLEODBC的错误信息,详细的使用说明如下:

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错误14271429时各元素的内容。当这些OLE错误发生时,数组只有一行。

1-2                                发生OLE错误时AERROR( )函数创建的数组元素

元素编号

   

1

数值型,为14271429

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 Serverpubs数据库名为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 FoxProON ERROR会为你做些什么!

专家点评

在本题中,制作了两个非常棒的错误捕捉记录程序,讨论了Visual FoxPro在错误捕捉方面存在的缺陷,在进行客户/服务器开发中,这两个错误捕捉都是必需的。在进行错误记录中,使用了大量的系统函数,如:SYS(2003)SYS(1001)SYS(1271)SYS(5)等,以及文件操作函数,如:JUSTPATH()JUSTFNAME()JUSTDRIVE()JUSTTEXT()以及JUSTSTEM()等,都是非常有用的,关于这些函数可以参考Visual FoxPro的帮助文件。

 

原创粉丝点击