回 帖 发 新 帖 刷新版面

主题:怎么避免程序中找不到数据表的错误??

一个foxpro编写的程序,但由于有时数据表(dbf)程序就会中断,并弹出查找数据表的文件选择框,此时,程序也无法退出,非常麻烦!要在程序中写入什么语句才能使程序在找不到数据表的情况下自动退出并提示数据表不存在?请高手指点。谢先

回复列表 (共4个回复)

沙发


有时数据表(dbf)损坏或不存在程序就会中断,

板凳


ON ERROR [Command]


文件“名”不存在 (错误 1)
找不到别名 (错误 13)
“文件”不是一个数据表 (错误 15)

3 楼

你可以使用 TRY...CATCH...FINALLY 命令作为一个控制结构,去处理代码在运行时可能出现的错误或异常情况。  TRY...CATCH...FINALLY 结构包含 TRY、CATCH 和 FINALLY 代码块,因此你可以指定可能产生错误的语句、处理这些错误的语句和执行清除操作的语句。

TRY...CATCH...FINALLY 结构起始于 TRY 语句,它标志 TRY 块的开始。在 TRY 块中,你可以指定在运行时可能产生错误的代码。如果在 TRY 块的程序完成后没有产生错误或异常情况,它就跳转到 CATCH 块并搜索 FINALLY 块到结构结束,如果该块存在,就运行相应的语句。如果 FINALLY 块不存在,程序就继续执行结构外在 ENDTRY 语句后的第一行语句,它标志  TRY...CATCH...FINALLY  结构结束。

注意: 
Visual FoxPro 允许 TRY...CATCH...FINALLY 结构没有 CATCH 和 FINALLY 块,它会将错误逐步提升到一个更高级别的错误处理程序。
   

你也可以将TRY...CATCH...FINALLY 结构嵌套进一个 TRY、CATCH 或 FINALLY 块中。

下列章节讲述了你可以在这些代码块中完成“错误处理”的任务。

产生异常情况 

捕捉异常情况 

逐步提升异常情况 

直接退出 TRY...CATCH...FINALLY

在 TRY...CATCH...FINALLY 中使用命令

运行 FINALLY 语句

更多信息,请参见 TRY...CATCH...FINALLY 命令。


产生异常情况 (Exceptions) 
当一个错误出现在 TRY 块的下列位置中,Visual FoxPro 会产生或 "发出" 一个异常情况 ,并创建一个包含有关错误详细资料的 Exception (异常情况) 对象:

一个代码行。包括调用外部过程,该过程包含错误但不包含它们自己的错误处理程序。


从一个对象调用方法,当该方法代码包含错误,并且该对象不包含 Error 事件代码。
另外,如果 Error 事件代码存在,该对象处理错误的Error 事件除非该方法包含它自己的 TRY...CATCH...FINALLY 错误处理程序。

注意: 
当 Exception 对象被创建时,你不能运行代码。该被创建的Exception 对象总是作为一个 Exception 基本类的形式存在。如果你希望使用Exception 类的子类,你应在 CATCH 或 FINALLY 块中再发出该异常情况。Visual FoxPro 程序文件(.prg)仅支持 Exception 对象,尽管你可从运行在设计环境的表单发出异常情况。你不能从在动态链接库文件(.dll)的COM 对象或可执行文件(.exe) 中发出 Exception 对象。更多信息,请参见 Exception 类。
   

在错误发生后,Visual FoxPro 通过移到第一个CATCH 语句来处理或“捕捉”该异常情况,并搜索在CATCH 块中的适当语句去处理该异常情况。

捕捉异常情况 (Exceptions) 
该程序着眼于它们出现在CATCH 块中确定处理异常情况语句存在的CATCH 语句的次序。如果该程序发现一个处理异常情况的CATCH 语句,该程序就运行相应的代码。

CATCH 语句可以包含可选的TO和WHEN子句。可通过在TO子句中使用 VarName 参数指定一个内存变量,存储一个参数到被创建的 Exception 对象中。如果你想建立一个条件给 CATCH 块去运行,可以在 WHEN 子句指定一个逻辑表达式,在CATCH 块的语句运行前该表达式的值必须为“真”(.T.)。CATCH 语句的作用和CASE 语句相似,在 WHEN 子句中得到的值必须是一个逻辑表达式。如果TO和WHEN子句不存在,该 CATCH 语句的值被视为CATCH WHEN .T. (True).

程序在 CATCH 块中运行语句后,不返回到TRY 语句,也不寻找其他 CATCH 语句。而是直接转到 FINALLY 语句去运行任何留下的语句,如果该语句存在的话。另外,若该程序存在TRY...CATCH...FINALLY 结构就立即转到ENDTRY后面的语句。

逐步提升异常情况 (Exceptions) 
如果你想逐步提升或“再发出”该异常情况到一个更高水平的错误处理程序,可以包含一个 THROW 语句。你可从TRY...CATCH...FINALLY 结构的任何代码块中调用THROW。然而,你可在代码的任何一个错误处理程序存在的地方使用THROW,去捕捉异常情况。你不能从“命令”窗口调用 THROW。

警告: 
在 TRY...CATCH...FINALLY 结构外调用 THROW 命令,且未带适当的错误处理程序,会导致程序退出。
   

如果在TRY...CATCH 部分外使用 THROW,通过ON ERROR 程序或 Visual FoxPro 系统的替代 Error 事件发出异常情况,程序执行后不返回到THROW 语句出现的地方。下面的例子,显示代码行2,没有执行。该情况不同于一个从程序执行中发生错误情况返回到错误发生处的惯例:

  复制代码 
ON ERROR ? ERROR()
DO myProc1

PROCEDURE myProc1
   ?1
   THROW 11
   ?2
ENDPROC
 

记住,调用THROW 的目的是逐步提升异常情况到一个更高级别的错误处理程序。

如果一个外部TRY...CATCH 块存在一个邻近THROW 语句,当它从一个 CATCH 或 FINALLY 块内部被调用时,Visual FoxPro 就再分配被指定在 TO 子句中的从先前异常情况对象引用对象的内存变量,到一个被用发出异常情况创建的最新异常情况对象引用的对象。如果没有外部TRY...CATCH 结构存在,Visual FoxPro 发出该异常情况到一个ON ERROR 程序或错误事件,如果它们存在的话。另外,Visual FoxPro 显示适当的系统错误信息。

直接退出 TRY...CATCH...FINALLY 
你可以通过在 TRY 或 CATCH 块中包含 EXIT 语句,直接退出一个代码块。如果FINALLY 语句存在或在代码行后直接跟着ENDTRY 语句,该程序都将再继续运行。

在 TRY...CATCH...FINALLY 中使用命令
你可以从 TRY 或 CATCH 块内部使用不同的 Visual FoxPro 命令来影响代码的正常运行。然而,如果你使用了特殊快不允许的命令之一,Visual FoxPro在运行时会产生一个错误。除了当 CANCEL 或 QUIT 被使用时,在处理这些命令前,该 FINALLY 语句总是在运行 。下面的表列出了可以或不可以在TRY、 CATCH 或 FINALLY 块中使用的 Visual FoxPro 命令。

命令 TRY CATCH FINALLY 
CANCEL
 Yes
 Yes
 Yes
 
CLEAR ALL
 Yes
 No
 No
 
CLOSE ALL
 Yes
 Yes
 Yes
 
DOEVENTS
 Yes
 Yes
 Yes
 
ERROR
 Yes
 Yes
 Yes
 
EXIT
 Yes
 Yes
 Yes
 
LOOP
 No
 No
 No
 
QUIT
 Yes
 Yes
 Yes
 
RELEASE
 Yes
 Yes
 Yes
 
RESUME
 Yes
 Yes
 Yes
 
RETRY
 No
 No
 No
 
RETURN
 No
 No
 No
 
RETURN TO MASTER
 No
 No
 No
 
RETURN TO <ProcedureName>
 No
 No
 No
 
SET STEP ON
 Yes
 Yes
 Yes
 
SUSPEND
 Yes
 Yes
 Yes
 
THROW
 Yes
 Yes
 Yes
 
注意: 
你可以包含诸如 LOOP 命令在一个块中,只要你将其放置到一个内置的控制语句,例如象 FOR EACH...ENDOR 或 DO WHILE...ENDDO 中。你可以从 TRY、CATCH 或 FINALLY 块中调用 ERROR 命令。TRY...CATCH...FINALLY 处理 ERROR 命令象任何其他异常情况或使用THROW 命令一样。
  

运行 FINALLY 语句
如果程序定位于FINALLY 语句,它运行FINALLY 块中的代码。该FINALLY 块通常清除被TRY 块分配的任何资源,并且在控制TRY...CATCH...FINALLY 结构脱离前,它总是最后运行的代码。

当一个异常情况、未经处理情况或另外情况发生时,即使另一个异常情况处理程序如ON ERROR 程序或一个对象的Error 事件在发生作用,该 FINALLY 块总是在运行。

注意: 
你不能明确地转移程序控制权直接到一个CATCH 或 FINALLY 块。如果FINALLY 语句存在,你不能避开它,除非你使用CANCEL 命令停止程序的继续执行。如果你希望避开FINALLY 语句,你必须在FINALLY 块开始就提供一个检查条件的代码,如果遇到该条件,就脱离该块。
   

在 FINALLY 块运行后,程序于是直接进入 ENDTRY 语句后的语句。ENDTRY 语句结束 TRY...CATCH...FINALLY 结构。

4 楼

谢谢3-4楼的朋友,非常好的答案!谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册