日期:2012-03-12  浏览次数:21271 次


    即使采用了防御性编程技术之后,错误仍能进入到网页,这可能是因为测试并不充分,或者是因为所依靠的一些其他资源或服务没有正确工作。为了防止页面出现问题,在程序中要能够进行定制错误处理。

7.4.1 ASP缺省错误处理器
       前面已经看到过,ASP和IIS能找出网页中的大多数错误,并且能自动生成错误信息页,这些错误几乎总是500.100类型的,并且IIS用Server.Transfer方法装载以500-100.asp命名的缺省错误页,然后传送给客户。第4章介绍了这一工作过程,以及如何与定制错误网页接口。
       然而,运行期脚本错误不总是由IIS发现的,当一个运行期错误发生时,脚本引擎会查看一下目前执行点或语句的环境。如果正在执行一个子程序或函数,缺省的脚本引擎错误处理器通过终止子程序的运行并返回调用子程序的地方来指出错误。
       在这里,程序会查看是否实现了其他的错误处理器,如果没有的话,又会重复这个过程,然后返回到调用子程序的地方。当子程序返回到网页的主程序(在任何其他子程序或函数外面)时,程序又查看是否实现了任何其他的错误处理器。在这个过程中,只有确实没有发现其他的错误处理器,程序才给ASP提示错误,指示IIS把执行转到缺省的错误页面。
7.4.2 VBScript错误处理
       在VBScript中,可以使脚本解释器不处理其找到的任何错误,并且使用On Error Resume Next语句继续运行下个语句。一旦这个语句已被处理,脚本引擎将继续运行后面的程序,而不理会已经发现的任何错误。然而,这种过程仅适用于顺序执行语句的环境,换句话说,不适用于嵌套的函数或子程序。
1.  使用On Error Resume Next语句
一个错误在子程序中出现时,如果没有运行On Error Resume Next语句,那么错误将被交给调用它的环境,这个过程一直重复到找到运行On Error Resume Next语句的环境继续运行,或者找到缺省的脚本错误处理器,把错误交给ASP并且IIS显示缺省错误网页。这个过程如图7-16所示:

这种错误调用链意味着可以创建防止使程序停止运行的运行期错误的函数和子程序。如果在子程序的开头放置一个On Error Resume Next语句,任何运行期错误会中止这个子程序的运行,但是调用该子程序的程序将继续运行而不会引起网页的停止。
例如,如果需要向一个文件中写入字符串,可以通过一个独立的函数对文件进行访问文件,防止错误中断整个程序的运行:
' create a file named strFileName, overwriting any existing one with that name
' and writes strContent into it then closes the file
' returns True if it succeeds, or False on any error
Function WriteNewFile(strFileName, strContent)
       On Error Resume Next         ' turn off the default error handler
       WiteNewFile = Flase             ' default return value of function
       Set objFSO = CreateObject("Scripting.FileSystemObject")
       If Err.Number = 0 Then Set objFile = objFSO.CreateTextFile(strFileName, True)
       If Err.Number = 0 Then objFile.WriteLine strContent
       If Err.Number = 0 Then objFile.Close
       If Err.Number = 0 Then WriteNewFile = True
End Function
注意上面的程序在试图处理每个程序语句之前,先检查VBScript的Err对象的Number属性。如果这个值为0(还没有出现错误),那么就能够继续对文件的定入和创建过程。然而如果错误确实发生了,脚本引擎将设置Err对象的属性的值,并且继续处理下一行。
只要不引起错误而能正常运行,函数的返回值将设置为“True”。否则函数将返回“False”。在编程中可以在对其进行测试以后,再使用该函数和采取其他行动。
下面是一个简单的例子,我们希望对任务的第一部分采用一个独立的函数,以便能更精确地辨别出错误产生在何处。这样,调试时也更容易阅读代码。在页面的主程序中,可以调用三个单独的函数。
If CreateNewFile(strFileName) Then                         ' create the new file
       Response.Write "New file successfully created<BR>"
       If WriteContent(strContent) Then                       ' write the content
              Response.Write "Content written to file<BR>"
       Else
              Response.Write "ERROR: Failed to write to the file<BR>"
       End If
       If CloseFile(strFileName) Then
              Response.Write "File closed<BR>"
       Else
              Response.Write "ERROR: Failed to close the file<BR>"
       End If
Else
       Response.Write "ERROR: Failed to create the new file<BR>"