今天遇到的问题 _ 关于asp错误处理

今天遇到的问题 _ 关于asp错误处理

 

4.3.4 Server 对象的错误处置

       ASP 没有错误处置机制一直受到批评。

有一个 On Error Resum Next 语句,       VBScript 中。使脚本解释器忽略运行期错误并继续脚本代码的执行。接着该脚本可以检查 Err.Number 属性的值,判别是否出现了错误。如果出现错误,返回一个非零值。 ASP 3.0 中,也可以使用 On Error Goto 0 转回到缺省的错误处置。 ASP 2.0 中实际也进行这种处置,但是没有相应文档说明。

有一个新的错误处置功能: C 语言风格的 try 和 catch 语句。然而所有的这些错误处置技术都不是由 ASP 或 IIS 实现的而是由 ASP 使用的脚本引擎实现的        Jscript 中。

       第 7 章专门讨论脚本和脚本引擎涉及到调试和错误处置技术。

ASP 和 IIS 开发小组已经增加了一个新的功能,       同时。用于在 ASP 网页中进行错误处置。这分为两个部分: IIS 错误页面的配置及使用 ASP 一个新的方法和对象。

1 .   Server 对象的 GetLastError 方法

Server 对象有一个名为 GetLastError 新方法。与 VBScript Err 对象不同, ASP 3.0 中。不能为查看是否出现了错误而随时调用该方法,只能在一个 ASP 定制的错误网页中使用。如果像对 Err 对象进行操作那样,通过关闭缺省的错误处置(用 On Error Resum Next 语句)来使用,则 GetLastError 方法不能访问错误的详细数据。

该对象是一个名为 ASPError 新对象。这个对象具有一系列的属性,GetLastError 方法要做的事情是提供更多的有关错误源和错误原因的信息。 GetLastError 方法创建并返回一个对象的引用。这些属性返回有关在 GetLastError 方法调用之前呈现的最新错误的信息。

2 .   ASPError 对象的属性

并返回引发错误的实际代码,ASPError 对象提供了九个属性说明所出现的错误的性质和错误源。其属性及说明如表 4-4 所示:

表 4-4  ASPError 对象的属性及说明

属 性

说 明

ASPCode

例如 0x800A009 整型。由 ASP/IIS 发生的错误号。

ASPDescript

这个属性是错误的详细说明 字符串型。如果这个错误是与 ASP 相关的错误。

Categori

即 ASP 内部脚本语言、或一个对象 字符串型。错误源。

Column

整型。发生错误的文件中的字符位置

Descript

字符串型。错误的简短说明

File

字符串型。错误出现时正在处置的文件的名称

Line

整型。发生错误的文件中的行号

Number

整型。一个标准的 COM 错误代码

Sourc

字符串型。引发错误的行的实际代码

3 .   配置 “ 单个网页 ” 错误处置

页面看起来像是从服务器返回给客户端的一个错误信息页面, IIS 中 “ 不可思议 ” 地出现一个错误(例如 404 Not Found 时。但实际上并不是这样。普通的 HTML 网页,对一个错误进行响应时被下载并且发送给客户端。这些网页通常称为定制的错误网页( custom error page

错误网页作为 IIS 缺省安装部分,然而。可根据要求定制。事实上,也可以在 IIS 早期版本中建立定制的错误网页。

可以为每种不同类型的 HTTP 协议或服务器错误指定一个定制的错误网页, IIS 4.0 中。为服务器上任意的 Web 网站中的每个目录建立一个定制的错误信息网页。

1     IIS 缺省的错误网页

该页面放在 WinNT/Help/iishelp/common 目录下,由 IIS 提供的缺省错误页面放在 Web 服务器的 WinNT/Help 目录中。 Window 2000 中的 IIS 5.0 环境下。如图 4-17 所示:

图 4-17  缺省的错误页面位置

或者在文本编辑器中查看 HTML 源顺序和脚本代码。当一个 404 错误出现时,可在浏览器中打开这些文件检查结果。使用的页面是 404b.htm 这个文件包括一个客户端脚本代码局部,获得当前文档的 URL 从 document 对象的 url 属性中检索)并在该页面中显示:

<tr>

<td width="400" colspan="2"> <font style="COLOR:000000; FONT: 9pt/11pt 宋体 "> 您正在搜索的网页可能已经删除、更名或暂时不可用。 </font></td>

  </tr>

  <tr>

    <td width="400" colspan="2"> <font style="COLOR:000000; FONT: 9pt/11pt 宋体 ">

       <hr color="#C0C0C0" noshade>

<p> 请尝试下列操作: </p>

       <ul>

请检查其拼写是否正确。 <br><li> 如果您在地址 ” 栏中键入了网页地址。;

      </li>

<li> 打开 <script>

         <!--

         if ! window.navigator.userAgent.indexOf "MSIE" > 0 && window.navigator.appVersion.charAt 0 == "2"

        

         //-->

寻找指向所需信息的链接。 </li>          </script> 主页。;

 

<script>

funct Homepag {

<!--

       DocURL = document.URL;

4        protocolIndex=DocURL.indexOf "://".;

protocolIndex + 3        serverIndex=DocURL.indexOf "/".;

1 + 1       BeginURL=DocURL.indexOf "#".;

serverIndex        urlresult=DocURL.substr BeginURL.;

serverIndex        displayresult=DocURL.substr protocolIndex + 3 .;

       document.writ '<A HREF="' + urlresult + '">' + displayresult + "</a>" ;

}

//-->

</script>

如图 4-18 所示: 这会产生你经常看到页面。

图 4-18  发生 404 错误时的页面

2     IIS 中错误网页的映射

会把相应的错误页面传送给客户端。如何判别应该向客户端发送那一个页面?很明显,当 IIS 检测到一个错误时。网页的名字应具有解决这个问题的一些信息,但事实上文件名是不重要的错误和错误网页文件之间的映射关系是每个目录的 properti 对话框的 Custom Error 选项卡中决定的

想编辑映射关系的目录上单击右键, Internet Servic Manag 中。并选择 Properti 如果对示例文件进行设置, Chapter04 目录中选择 server 子目录,如图 4-19 所示:

图 4-19  设置属性时的页面屏幕

如图 4-20 所示: Properti 对话框的 Custom Error 选项卡在 IIS 装置时(除非已经进行过修改)设置了缺省映射关系的列表。

图 4-20  映射关系的列表

比方 “ Invalid Applicat Server Shut Down 等等。然而,靠近该列表的底部是 HTTP 错误 500 100 一个条目。类型 500 错误是由 ASP 发生的可以从中看出一些错误已经与错误网页建立了映射关系。这些错误都是一般性的错误。如果 ASP 载入包括语法错误的页面,或者出现一个运行期错误,则出现 500 100 错误页面。列表中显示的缺省映射关系标明,这个目录中的一个文件出现上述错误时,将执行 500-100.asp 页面。

所看到信息不再是一个普通的 Web 网页,当一个 ASP 错误出现时。而是一个 ASP Web 网页(也就是说它具有文件扩展名 .asp 也可以根据需要编辑该映射关系来指向另一个页面。

3     指定一个定制的错误网页

打开 Error Map Properti 对话框。 Messag Type 下拉列表中选择 URL 键入自己的定制错误网页的完整虚拟路径,单击 Custom Error 选项中的 Edit Properti 按钮。如图 4-21 所示:

图 4-21  指定错误页面的虚拟路径的屏幕

可能要使用不同的路径。 图 4-21 中给出的值指向我创立的与示例网页一起使用的一个定制错误网页。根据你装置示例文件的具体位置。

将打开我定制错误页面。 Messag Type 其他两个选项是 现在无论何时出现一个 500 100 类型的错误。

而不是指定一个发送给客户端的页面。 Default 缺省)可以简单地输入一个短的文本信息。

File 文件)指定一个 HTTP 错误网页的物理路径。

指定的网页由 IIS 载入,选择 File 选项时。载入的方式与在 Window Explorer 中双击要载入的文件时的方式相同。这意味着 ASP 网页不能使用这个选项,因为在这种情况下不会执行其中的任何脚本。

4 .   使用 GetLastError 方法和 ASPError 对象

编辑了错误映射属性的目录内的任一页面上出现一个与 ASP 相关的错误时,配置好 IIS 后。都将载入定制错误页面。实际上,现在已经设置了一个正常的脚本错误陷阱,因为在这个目录内的任何一个网页上的 ASP 运行期错误都将触发定制错误页面。

这意味着能够访问正在运行的原网页的全部环境。可以在脚本环境中获取信息,事实上在内部 IIS 通过 Server.Transf 方法进行这种操作。这样可以根据所出现的错误决定要做些什么。此基础上,可以在定制的错误网页中检索 ASPError 对象,找到引起载入页面出错的错误的所有信息。

编辑错误映射属性要做一些类似的工作。但是只有一般的 500 错误( Internal Server Error 映射中是可用的另外, IIS 4.0 中。当定制错误网页载入时,不会传送网页的环境,除了提供一个非特定的错误信息外,做其他任何工作都是比较困难的

其中可以看到 ASPError 对象的详细情况。单击 Server.GetLastError 对应的按钮,以前例子中已经使用过 ASP Server Object 示例页面。如图 4-22 所示:

图 4-22  检查 ASPError 对象的详细屏幕

其中的 ASP 脚本检查点击的哪个按钮。如果是 Server.GetLastError 对应的名为 cmdGetError 按钮,这个操作会重新载入该网页。将执行一些示例代码,这些代码将会发生一个运行期脚本错误。

 

If Len Request.Form cmdGetError Then

              Dim arrThi 3

              ArrThi 4 = Caus an error

End If

 

即配置为装入定制错误页面,因为已对这个目录设置了错误网页映射。所以当错误出现时,就打开这个页面(通过 Server.Transf 方法在后台不可见地工作)见图 4-23 所示:

图 4-23  定制的错误网页

1     示例错误网页代码的功能

并通过使用 Response.Statu 方法,定制错误网页显示 ASPError 对象属性的所有值。把一个 HTTP 报头状态消息返回给客户端,指明呈现了一个错误。接着使用 GetLastError 方法获取对 ASPError 对象的一个引用,因此可以访问错误的详细数据:

 

<%

Response.Statu = "500 Internal Server Error"

Set objASPError = Server.GetLastError

%>

Current execut the page: <B>show_error.asp</B><P>

<B>Error Details:</B><BR>

ASPError.ASPCod = <% = objASPError.ASPCod %><BR>

ASPError.Numb = <% = objASPError.Numb %> 0x<% = Hex objASPError.Numb %> <BR>

ASPError.Sourc = <% = Server.HTMLEncod objASPError.Sourc %><BR>

ASPError.Categori = <% = objASPError.Categori %><BR>

ASPError.Fil = <% = objASPError.Fil %><BR>

ASPError.Lin = <% = objASPError.Lin %><BR>

ASPError.Column = <% = objASPError.Column %><BR>

ASPError.Descript = <% = objASPError.Descript %><BR>

ASPError.ASPDescript = <% = objASPError.ASPDescript %>

<FORM ACTION="<% = Request.ServerVari "HTTP_REFERER" %>" METHOD="POST">

<INPUT TYPE="SUBMIT" NAME="cmdOK" VALUE="&nbsp;&nbsp;&nbsp;">

&nbsp; Return to the previou page<P>

</FORM>

IIS 将仅仅返回一个与错误代码 500 100 对应的一般性消息。这可能是脚本引擎自己的错误消息,值得注意的一点是如果一个脚本或 ASP 错误呈现在定制错误网页中。或者只是相当简单的消息: Internal Server Error 不会再次重新载入定制的错误网页。

可以使用存储在任何 ASP 内部对象集合或属性中的值。例如,包括错误的网页的全部环境将传送给定制错误网页。也就是说。如果检索来自 Request.ServerVari 集合的 HTTP_REFERER 值,将反映调用原网页的网页(即在错误出现之前的网页) URL 服务器把执行转到错误网页时,这个值不会发生变化,并且它将不包括当错误发生时正在执行的网页的 URL

SCRIPT_NAME 值将是包括该错误的网页的名字,同样。而不是错误网页的 URL 一个错误网页已经装入时,通过检查浏览器地址栏中的 URL 可以对此进行确认。但是原网页的脚本变量中存储的值,定制的错误网页中都是不可用的

即在网页的最前面包括有一个 <% @PANSACTION= %> 指令,如果原 ASP 网页正在一个事务内运行。也应该确定是否需要在网页中采取一些方法,以退出该事务。例如可以调用内置 ObjectContext 对象的 SetAbort 方法:

objectContext.SetAbort        Fail the transact if an ASP error occurs

本书的后面将介绍与事务的相关全部内容。

2     使用 ASPError 对象的属性

有以下几点值得注意的 关于使用 ASPError 对象的属性。

Number 属性应该一直有一个值。如果 ASP 网页调用 GetLastError 方法时没有错误呈现,即使没有出现错误。该属性的值是 0 通常情况下,对 ASP 脚本的运行期错误, Number 属性返回十六进制的值 “ 0x800A0000 加上规范的脚本引擎错误代码。例如,前面的例子对 “ Subscript out of Rang 错误的返回值为 “ 0x800A0009 因为 VBScript 对该类型错误的错误代码是 9

Categori 和 Descript 属性将一直有一个值。 当出现已经过一个错误时。

对大多数脚本错误将为空。更多情况下, APSCode 属性的值由 IIS 发生。涉及外部组件使用出错时有相应的值。

而不是由当前正在使用的脚本引擎发生的并且对大多数脚本错误而言将是空的更多情况下, ASPDescript 属性的值由 ASP 预处置顺序发生。对诸如对 ASP 内置对象调用无效的方法的错误有相应的值。

并且在错误的详细数据是可用的情况下才干进行设置。对一个运行期错误, File Sourc Line 和 column 属性仅在错误出现时。 File 和 Line 属性通常是有效的但是 column 属性经常返回 -1 当错误是一个阻止页面被 ASP 处置的语法错误,才返回 Sourc 属性。一般在这些情况下, Line 和 Column 属性是有效的如果把 Sourc 属性的值写到页面,明智的方法是先将该值传给 HTMLEncode 以防在其含有非法的 HTML 字符。本章的后面将详细地讨论 HTMLEncode 方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值