无精症的症状:关于vb中捕获错误语句的使用

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 05:54:50
启动一个错误处理程序并指定该子程序在一个过程中的位置;也可用来禁止一个错误处理程序。

语法

On   Error   GoTo   line  
On   Error   Resume   Next
On   Error   GoTo   0

On   Error   语句的语法可以具有以下任何一种形式:

语句 描述
On   Error   GoTo   line   启动错误处理程序,且该例程从必要的   line   参数中指定的   line   开始。line   参数可以是任何行标签或行号。如果发生一个运行时错误,则控件会跳到   line,激活错误处理程序。指定的   line   必须在一个过程中,这个过程与   On   Error   语句相同;   否则会发生编译时间错误。
On   Error   Resume   Next 说明当一个运行时错误发生时,控件转到紧接着发生错误的语句之后的语句,并在此继续运行。访问对象时要使用这种形式而不使用   On   Error   GoTo。
On   Error   GoTo   0 禁止当前过程中任何已启动的错误处理程序。
说明

如果不使用   On   Error   语句,则任何运行时错误都是致命的;也就是说,结果会导致显示错误信息并中止运行。
一个“允许的”错误处理程序是由   On   Error   语句打开的一个处理程序;一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时(在发生错误和执行   Resume、Exit   Sub、Exit   Function   或   Exit   Property   语句之间这段时间)又发生错误,则当前过程的错误处理程序将无法处理这个错误。控件返回调用的过程。如果调用过程有一个已启动的错误处理程序,则激活错误处理程序来处理该错误。如果调用过程的错误处理程序也是活动的,则控件将再往回传到前面的调用过程,这样一直进行下去,直到找到一个被允许的但不是活动的错误处理程序为止。如果没有找到被允许而且不活动的错误处理程序,那么在错误实际发生的地方,错误本身是严重的。错误处理程序每次将控件返回调用过程时,该过程就成为当前过程。在任何过程中,一旦错误处理程序处理了错误,在当前过程中就会从   Resume   语句指定的位置恢复运行。

注意       一个错误处理程序不是   Sub   过程或   Function   过程。它是一段用行标签或行号标记的代码。

错误处理程序依靠   Err   对象的   Number   属性中的值来确定错误发生的原因。在其它任何错误发生之前,或在调用一个可能会导致错误发生的过程之前,错误处理程序应该先测试或存储   Err   对象中相关的属性值。Err   对象中的属性值只反映最近发生的错误。Err.Description   中包含有与   Err.Number   相关联的错误信息。
On   Error   Resume   Next   会使程序从紧随产生错误的语句之后的语句继续执行,或是从紧随最近一次调用含有   On   Error   Resume   Next   语句的过程的语句继续运行。这个语句可以置运行时错误于不顾,使程序得以继续执行。可以将错误处理程序放置在错误发生的地方,而不必将控件传输到过程中的其它位置。在调用另一个过程时,On   Error   Resume   Next   语句成为非活动的,所以,如果希望在例程中进行嵌入错误处理,则应在每一个调用的例程中执行   On   Error   Resume   Next   语句。

注意       当处理在访问其它对象期间产生的错误时,与其使用   On   Error   GoTo   指令,不如使用   On   Error   Resume   Next。每次和对象打交道,在不知道用代码访问哪个对象时,检查一下   Err   都会打消这种疑虑。可以确定是哪个对象产生错误(Err.Source   中指定的对象),也可以确定是哪个对象将错误代码放在   Err.Number  
中。

On   Error   GoTo   0   停止在当前过程中处理错误。即使过程中包含编号为   0   的行,它也不把行   0   指定为处理错误的代码的起点。如果没有   On   Error   GoTo   0   语句,在退出过程时,错误处理程序会自动关闭。
在错误未发生的时候,为了防止错误处理程序代码运行,请像在下段程序中那样,在紧靠着错误处理程序的前面写入   Exit   Sub、Exit   Function   或   Exit   Property   语句。

Sub   InitializeMatrix(Var1,   Var2,   Var3,   Var4)
On   Error   GoTo   ErrorHandler
.   .   .
Exit   Sub
ErrorHandler:
.   .   .
Resume   Next
End   Sub

此处,错误处理程序代码在   Exit   Sub   语句之后,而在   End   Sub   语句之前,从而与过程中的流程分开。错误处理程序代码可以在程序中的任何地方写入。

当对象作为文件运行时,对象中未捕获的错误都被返回控制应用程序。在开发环境中,如果设置了正确选项,未捕获的错误只返回控制应用程序。请参考主应用程序的文档的有关描述,从而得知,在调试时应该设置哪些选项、如何设置这些选项以及主机能否建立类。

如果建立一个访问其它对象的对象,则应该着手处理从那些对象返回的未处理错误。如果无法处理这种错误,请将   Err.Number   中的错误代码当作自己的一个错误,然后将错误回传给对象的调用者。应该将错误代码添加到   vbObjectError   常数上来指定这个错误。举例来说,如果错误代码为   1052,则使用如下方法指定错误:

Err.Number   =   vbObjectError   +   1052

注意       调用动态链接库   (DLL)   期间产生的系统错误不会产生例外情况,也不会被   Visual   Basic   的错误捕获操作所捕获。当调用   DLL   函数时,应该(根据   API   的详细说明)检查每一个返回值以确定是成功还是失败,如果失败,则检查   Err   对象的   LastDLLError   属性中的值。  

 

本示例先使用   On   Error   GoTo   语句在一个过程中指定错误处理的代码所在。本示例中,试图删除一已经打开的文件从而生成的错误码为   55。这个错误将由示例中的错误处理程序码来处理,处理完後,控制会回到发生错误的语句处。On   Error   GoTo   0   语句关闭错误陷阱。然后   On   Error   Resume   Next   语句用来改变错误陷阱,以便发觉下一个语句产生的错误的范围。请注意示例中使用   Err.Clear   在错误处理完後,清除   Err   对象的属性。

Sub   OnErrorStatementDemo()
On   Error   GoTo   ErrorHandler '   打开错误处理程序。
Open   "TESTFILE "   For   Output   As   #1 '   打开输出文件。
Kill   "TESTFILE " '   试图删除已打开的文件。
On   Error   Goto   0 '   关闭错误陷阱。
On   Error   Resume   Next '   改变错误陷阱。
ObjectRef   =   GetObject( "MyWord.Basic ") '   试图启动不存在
'   的对象
'检查可能发生的   Automation   错误。
If   Err.Number   =   440   Or   Err.Number   =   432   Then

'   告诉用户出了什么事。然后清除   Err   对象。
Msg   =   "There   was   an   error   attempting   to   open   the   OLE   object! "
MsgBox   Msg,   ,   "Deferred   Error   Test "
Err.Clear '   清除   Err   对象字段。
End   If
Exit   Sub '   退出程序,以避免进入错误处理程序。
ErrorHandler: '   错误处理程序。
Select   Case   Err.Number '   检查错误代号。
Case   55 '   发生“文件已打开”的错误。
Close   #1 '   关闭已打开的文件。

Case   Else
'   处理其他错误状态   .   .   .  
End   Select
Resume '   将控制返回到产生错误的语句。
End   Sub

i

Visual   Basic   6之中的错误处理机制对实现一流的代码编制并不是很有利。在大多数的VB应用程序之中典型的错误处理类似于这样:      


Public   Sub   DoSomething()
Dim   objSomeObject   As   Object

On   Error   GoTo   ErrorHandler

注释:Do   something

Set   objSomeObject   =   Nothing

Exit   Sub

ErrorHandler:
Set   objSomeObject   =   Nothing

注释:Handle   Error
Call   Msgbox( "Error   Number:   "   &
Err.Number)
End   Sub  
这种方法的问题在于,任何清除的代码都必须被复制,包括在主执行路径和错误处理器之中的。这种方法的另一个问题是程序有多个退出点。

这里是处理错误的一个简洁的方法:

Public   Sub   DoSomething()
Dim   objSomeObject   As   Object

On   Error   GoTo   Cleanup

注释:Do   something

Cleanup:
Set   objSomeObject   =   Nothing

注释:Handle   Error
If   Err.Number   <>   0   Then
Call   Msgbox( "Error   Number: "   &   Err.Number)
End   If
End   Sub  
通过让代码进入清除段,清除就会只出现一次。在执行了清除之后,代码就会进行检查,看是否有错误出现并适当地对其进行处理。