VBScript语言提供了两个语句和一个对象来处理"运行时错误",如下所示:
  • On Error Resume Next语句 

  • On Error Goto 0语句 

  • Err对象

简单介绍一下On Error Resume Next,On Error Goto 0,Err这三者

当加上On Error Resume Next语句后,如果后面的程序出现"运行时错误"时,会继续运行,不中断。

Err对象保存了“错误信息”

没有加上On Error Resume Next语句

举例(/test.asp文件):


i = 1/0 '0作除数,产生"运行时错误",显示"出错信息"并停止程序的执行
Response.Write "除法执行后" '这句话将不会执行
On Error Resume Next '后面的程序即便出现"运行时错误"时,也会继续运行
i = 1/0 '0作除数,这是一种"运行时错误",但因为有了上面On Error Resume Next这句话,所以不会中断执行,而是会继续运行下去
Response.Write "除法执行后" '这句话将会执行
Dim i
i = 1/0 '第一个错误
test

"   '第二个错误,函数undefined_function未定义
Dim i
On Error Goto 0   '后面的语句一旦有错误发生就会提示错误,并结束脚本执行
运行结果:
错误 '800a000b'

被零除

/test.asp 

详细讲一下On Error Resume Next

On Error Resume Next语句只作用于本级别的后续语句。不会作用于被调用的函数或子程序,同样也不会作用于父级别的程序段

一个子程序中如果没有On Error Resume Next语句,那么当错误在子程序中出现时,将会中断这个子程序的运行,跳转到调用这个子程序的外层程序.如果这个外层程序在“出问题的函数调用”之前包含有On Error Resume Next语句,则会接着执行“函数调用”之后的语句。如果这个外层程序在“出问题的函数调用”之前没有On Error Resume Next语句,那么就跳向外层。这个过程一直重复,直到找到包含有On Error Resume Next语句的环境继续运行,如果最外层的程序也没有包含On Error Resume Next语句,那么将会使用缺省的错误处理器,也就是显示错误信息并停止运行。

 i = 1/0
Sub test1()
End Sub
 

除法执行后

两个ok都没有被打印。因为On Error Resume Next是在最外层下达的,所以当调用的子程序中出了问题之后,会直接从子程序中跳出,跳到外层的代码中。

例如,如果需要向一个文件中写入字符串,可以通过一个独立的函数对文件进行访问,防止错误中断整个程序的运行:


'and writes strContent into it then closes the file
'returns True if it succeeds, or False on any error
WiteNewFile = Flase 'default return value of function
If Err.Number = 0 Then objFile.WriteLine strContent
End Function

上面的程序在处理每个程序语句之前,先检查Err对象的Number属性。如果值为0(还没有出现错误),那么就能够继续对文件的创建和写入过程。如果错误发生了,脚本引擎将设置Err对象的属性的值,并且继续处理下一行。

On Error Goto 0语句

在运行这个语句后,发生的运行期错误将导致缺省错误处理,在环境链中检查每个嵌套的程序,直到主页面代码。如果没有Err对象

Err对象存储了关于运行期错误的信息

Description Number Source
清除当前所有的Err对象设置
产生一个运行期错误

使用Err对象生成一个“自定义错误”。

下面的例子显示了在服务器磁盘上读取一个文本文件时,如何处理错误。注意如何使用常数vbObjectError,以确定所选择的错误号不会和一个已存在的错误号混淆。通过把任意选择的错误号加到此常数中,就能够保证和预定义的错误不混淆。


Set bjFSO = CreateObject("scripting.FileSystemObject")
Case 0 'OK, take no action
Case 50,53 'standard file or path not found errors
'create custom error values and raise error back up the call chain
intErrNumber = vbObjectError + 1073 'custom error number
Err.Raise intErrNumber, strErrSource, strErrDescription
'raise the standard error back up the call chain
End Select
ReadThisFile = objFile.ReadAll ' we opened it OK, so return the content

If Err.Number = 0 Then
    Response.Write Err.Source & "
" & Err.DescriptionEnd If