CSDN=>FAQ=>FAQ 展示
  • 问题内容:如何做捕捉错误提示
  • 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5627271
  • 所属论坛:VFP     审核组:其他数据库开发
  • 提问者:ourangel     解决者:apple_8180
  • 感谢:
  • 关键字:其他数据库开发 VFP 捕捉错误
  • 答案:

    我有一个数据录入界面,数据录入后,点保存按钮,按钮里有计算公式。数据错误时,vf会提示数值上溢(39)错误,我想在出现这类错误时,不要系统提示的错误对话框,而提示我自己写的,比如:“数据有错误,请修改”,然后反回到录入数据的界面中,能修改数据。vf提示错误后,程序就不能正常运行了。
    ---------------------------------------------------------------

    转一下张洪举老师书的代码:

    将以下代码存入一个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)) &&捕获、写、显示错误

  • 评价: 有价值 给朵鲜花(3) 无价值 扔个鸡蛋(0)
相关FAQ
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo