ASP3.0中的ASPError对象

作者:不详 来源: 日期:2002-6-20
在IIS 5.0版中最好的改进是ASP中展现的最新特征。这些特征包括现存对象中的新方法、一
个新组件、ADO和脚本引擎的升级。 

自从IIS 3.0和ASP的合并,Application(应用程序)和Session(会话)对象是嵌入式的并
且已经是可用的。两个对象都支持Contents(内容)集合,该集合由存在于适合对象的存储
器中的所有变量组成。你可以检查这个集合,检查它的内容,改变它的选项的值。

IIS 5.0中介绍了两种Contents集合的新方法,Remove(清除)和RemoveAll(全部清除)。
Remove方法可以从Contents集合中删除一项,RemoveAll从存储器中清除整个集合。这些方
法为开发者提供便利,使他们能写出更高效的代码以在脚本执行时管理服务器资源。对
Application和Session对象来说,甚至可以在请求未发生时使用服务器资源,当变量不再被
需要时,存储器可以释放它们。语法简单。在基于1的集合中使用Remove方法,你仅仅涉及
变量名或它的数字的位置。RemoveAll方法将删除集合中的所有项。 

服务器对象可以用三种新方法处理。Execute(运行)方法从字面意义上讲是一个程序调
用,运行时不用考虑你传递给它什么资源。Transfer(传递)方法是一个功能方向控制器,从
一页运行到下一页。可以返回一个ASPError对象的GetLastError方法也被引入IIS 5.0。
Server.Execute可以用来强制运行页内的ASP文件。Execute方法调用已引用的资源,一个文
件被正确的执行,就像它是被浏览器请求直接调用一样,但实际上却是服务器而非浏览器做
出这个请求。下面用一些代码来说明这一点。

<html> 
<head><title></title></head> 
<body> 
<Language=VBScript> 
The time is <%=time()%> 
<table><tr><td><b> Server Variable </td></tr></b>
<td><b>Value</b></td></tr>
<tr><td><b><Reques.ServerVariables()></b></td>
<td><b><Request.ServerVariables()></b></td></tr>
</table>
</body>
</html>

这几行附加到被执行文件中的代码用于计算URL头的值,它是由浏览器传递的被请求资源。
URL值是被请求的资源,当你请求另一文件时,它传达Server.Execute命令来执行发出请求
的文件,从而你将得到一个不同的响应。请注意被请求的URL是对被请求文件的原始请求。
Server.Execute命令直接请求要求的资源,而非由浏览器发布的命令。URL值说明原始的请
求没有改变,运行请求不需要浏览器和服务器间来回交互。直到页被处理完毕服务器才脱离
控制,这样,资源处理的效率是很高的。

Sever.Transfer是一个控制重定向函数,它把处理传递到被请求路径。这与响应重定向函数
不同,在控制重定向中控制从不离开服务器。Response.Redirect实际上发送了一个响应到
浏览器,它产生一个附加请求到服务器申请另外的资源。服务器接着返回新的被请求资源。
Sever.Transfer执行本质上同样的功能,但是由于在浏览器和服务器间没有第二个响应,这
使得在页与页之间的控制传递更加高效。

Sever.Transfer方法解决了许多Response.Redirect方法的问题,而不仅仅是效率的问题。
当Server.Transfer方法被调用时,所有会话级或应用级的变量或对象被分配到调用页,使
方法引用在下个资源是可行的。

使用Server.Transfer后的文件内容可以先于对Server.Transfer的调用被返回到浏览器。
Response.Redirect方法要求全部内容在调用方法之前被缓存,但是Server.Transfer解决了
这个问题,使处理这个方法少了些繁重工作。Server.Transfer方法一个重要方面是当在其
他网络应用程序中请求一页时支持相同的会话ID。当Server.Transfer方法被调用时,请求
页仍运行在包含被请求的原始资源的网络应用中。然而,其他应用的Global.asa文件将不被
激活,所以该文件中的变量或对象将不被建立。

GetLastError方法对服务器对象来说可能是最好的改进。在处理产生错误的事件中
Server.GetLastError产生一个ASPError对象。ASPError对象是ASP中实现的错误处理的第一
个版本,带有许多可以提供关于讨厌的错误的信息的特性。GetLastError方法的目的是返回
可用对象的引用。ASP服务器端脚本处理有三个基本问题,ASPError对象将俘获所产生的错
误:预处理错误如头文件;编译错误如不正确的代码;不正确的数据处理可产生的运行错
误。

在处理ASP请求中,当IIS遇到这些错误之一时,Server.Transfer方法被调用,500-100.ASP
错误页被请求。你可以将这页定制到你的中心内容,ASPError对象可以用来定制错误页以提
供所发生错误的信息。

下列摘自文件Badcode.asp的ASP代码:

<Language=VBScript>
<br>
` We dim an array, then assign a value to the
` array that is out of scope.
<Dim nArray(3)>
<nArray(0) = 0>
<nArray(1) = 1>
<nArray(5) = 5>


因涉及一个超出它的尺度范围之外的nArray元素,此页产生一个编译错误。当此页被请求
时,将产生一个错误,网络服务器调用Server.Transfer方法传送控制到定义的错误页。当
然你可以使用缺省页,我选择在这儿构造我自己的错误页,你需要通过
Server.GetLastError来存取 ASPError对象。这儿我已实现我的版本,你可以看到通过存取
定制错误页的微软实现,错误页缺省的装在你的服务器\help\iishelp\common\目录下。

ASPError Object
这个新增的,内置与ASP 3.0中的对象提供了一个以往版本中没有的
专门用来处理错误的对象,这样,我们来操纵错误就可以成为可能了。
以前你可以使用VBScript中的On Error Resume Next或则Jscript的try ... Catch来捕获错
误,
但是你不能够捕获到COM对象、或则内置的ASP对象中发生的错误
但是如果你要是使用了ASPError对象的话,那么一切都将有可能改变。

要使用这个对象,首先我们需要做的是在IIS中自定义HTTP错误信息(如何做我可是说了不

10次了,呵呵。)。这样当与ASP相关的错误信息发生后,就会触发HTTP error 500;100。

然后在ASP脚本中可以通过访问ASPError对象来判断到底是发生了什么样的错误,
ASPError对象有一系列只读的属性获取最后一个错误的详细信息。
这个服务端的对象包含有一个新的方法GetLastError,必须使用它来获取发生的
错误信息。

现在还是让例子来说明问题把,假设用来处理错误的脚本文件为 CatchError.asp.
首先应该设置IIS的自定义错误信息中的HTTP 500;100均重新定位与CatchError.asp.
然后就是按照自己的方式来显示错误信息了,代码如下:following code: 
<%
Dim objLastASPError
Set objLastASPError = Server.GetLastError
%>

捕获到一个错误:<BR>
错误描述: <%=objLastASPError.Description%><BR>
错误类别: <%=objLastASPError.Category%><BR>
错误文件: <%=objLastASPError.File%><BR>
错误编号: <%=objLastASPError.Number%><BR>


ASPError对象、Server.Transfer、Server.Execute是ASP 3.0中新增的
内容。当然还有其他一些小的改动。例如,在ASP 2.0中默认的Response.Buffer被设置为
False. 
而在ASP 3.0中Response.Buffer默认被设置为True. 
相关文章