分享
 
 
 

ASP 3.0高级编程(三十四)

王朝asp·作者佚名  2006-12-16
窄屏简体版  字體: |||超大  

7.4.4 使用IIS错误页面

与ASP错误处理过程相关的内容是为IIS提供可定制的错误页面。事实上,在IIS 4.0中也有这个特点。但新的ASP内置对象ASPError,更易于使用且提供更加强大的功能。

在第4章,当我们研究Server.Execute和Server.Transfer方法时,已经讲述了如何建立定制的错误页面。我们也讨论和使用了ASPError对象,但这种方式受到了一定的限制。在这一部分,将介绍如何将定制的错误网页和ASPError对象结合起来建立一个更好的处理ASP错误的方法。

我们可以使用VBScript检查ASPError对象的内容,从而创建一个定制的错误页面。构建一个包含错误内容全面信息的字符串,且写入到服务器磁盘上的日志文件中。然而网页的设计仅使访问者看到网页不可用这样一条信息是不行的,应该使访问者能够选择是重新载入上一个网页还是回到主页,使他们没意识已经发生了错误。

尽管我们采用VBScript创建这个网页,但其使用的一些特性对JScript来说也是适用的,这两种脚本语言的相互转换也是比较容易的。

可以从http://www.wrox.com站点下载本章及本书其他章节的示例文件。

1. 设置定制的错误页面

在能使用定制的错误页面之前,必须在Internet Services Manager进行相应的设置(设置方式见第4章)。把示例文件装入计算机的wwwroot目录中,打开Chapter07子目录的Properties对话框,在Custom Errors选项卡中,滚动列表并选中HTTP错误“500:100”条目,点击Edit Properties按钮,并键入定制的错误页面Custom_error.asp的URL

现在Chapter07子目录中的页面出现一个ASP错误时,就会打开定制的错误页面。

2. 使用定制的错误页面

在浏览器中打开Chapter07目录并选择到“Using a Custom Error Page”的链接,这个页面显示了一系列用于产生各种类型的错误的按钮,点击标有“Load a Page with a Syntax error”的按钮

这将载入一个名为syntax_error.asp的简单页面。然而看不到这个页面,因为这个页面包含了一个语法错误。ASP终止这个页面的编译/执行,并把执行转到定制错误页面,这个页面展示了错误的细节和两个按钮,这两个按钮用以返回上个页面(主菜单)或返回Web站点的缺省主页

这个页面也把错误报告追加到服务器磁盘C:\temp文件夹中名为custom_error.log的日志文件中,可以在文件编辑器中打开并查看它,图7-20所示的日志文件已经记录了几个错误。

如果在页面中得到了一个信息,指明日志文件不能写入信息,可能是因为IUSR_machinename(IUSR_计算机名)帐号没有访问C:\temp目录的权限。当测试这个页面时,应该给予IUSR_machinename帐号对这个目录的全部控制权,或者改变custom_error.asp页面的程序代码以指向一个IUSR有全部控制权的文件夹

错误消息出现在页面中的唯一原因,是因为在cause_error.asp页面中我们选择了相应的复选框。如果关闭该选项并再次点击按钮,便看不到错误的详细情况,然而错误信息仍然记录在服务器磁盘上的custom_error.log错误日志文件中。

“Display debugging information”复选框给定制错误页面(而不是日志文件)提供了更多的信息,有助于调试那些使用ASP内置对象集合值的页面

在本章下面部分,将再讨论这一问题,同时也可以了解“Cause An Error”页面上的其他按钮所提供的其他种类的错误信息。注意有一些按钮能够比其他的按钮能够提供更多信息。特别是只有最后一个按钮给出ASP错误代码的值(这里是ASP 0177)。

(1) “Cause An Error”页面的功能

与先前讨论的示例页面一样,引起错误的页面使用同样的技术,用<Form>把值提交给同一个页面。然后ASP程序查看窗口上点击的是那个SUBMIT按钮,然后运行代码的相应部分。同时查看是否页面上两个复选框是否选中,如果是这样,程序首先设置一个或两个会话级的变量以指明这一点。

<%

'see if we are displaying error and debug information

'set session variables to retrieve in the custom error page

If Len(Request.Form("chkShowError")) Then

Session("ShowError") = "Yes"

Else

Session("ShowError") = ""

End If

If Len(Request.Form("chkShowDebug")) Then

Session("ShowDebug") = "Yes"

Else

Session("ShowDebug") = ""

End If

...

%>

由于使用了Server.Transfer,当错误发生时,正在运行的网页的整个ASP环境由IIS传给定制错误页面。然而,脚本变量的值并没有传给定制错误页面,所以必须使用Session变量,或者把值添加到Request.Form或Request.QueryString集合以便把值传送给定制错误页面。

设置了Session变量之后,程序继续查看点击了哪个按钮。每个类型的错误(除了第一类型外),都是由运行相应的ASP代码产生的,第一类型的错误需要调用另一个页面。

...

'look for a command sent from the FORM section buttons

If Len(Request.Form("cmdSyntax")) Then

Response.Clear

Response.Redirect "syntax_error.asp"

End If

If Len(Request.Form("cmdParamType")) Then

intDate = "error"

intDay = Day(intDate)

End If

If Len(Request.Form("cmdArray")) Then

Dim arrThis(3)

arrThis(4) = "Causes an error"

End If

If Len(Request.Form("cmdFile")) Then

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set objTStream = objFSO.OpenTextFile("does_not_exist.txt")

End If

If Len(Request.Form("cmdPageCount")) Then

Set objPageCount = Server.CreateObject("MSWC.PageCounter")

objPageCount.WrongProperty = 10

End If

If Len(Request.Form("cmdObject")) Then

Set objThis = Server.CreateObject("Doesnot.Exist")

End If

%>

||||||(2) 定制错误页面的工作

知道了如何创建错误后,让我们来看看定制的错误页面。在前面的章节里已经知道了构建网页需要的理论,这里再概要地描述一下其工作过程。第一步是关闭缺省的错误处理器以便页面程序不被另一个错误中断。第二步通过创建一个新的ASPError对象收集原始错误信息。进行这个工作时要格式化一些值,并把它们转换成合适的数据类型。

<%

'prevent any other errors from stopping execution

On Error Resume Next

'get a reference to the ASPError object

Set objASPError = Server.GetLastError()

'get the property values

strErrNumber = CStr(objASPError.Number) 'normal error code

strASPCode = objASPError.ASPCode 'ASP error code (if available)

If Len(strASPCode) Then

strASPCode = "'" & strASPCode & "' "

Else

strASPCode = ""

End If

strErrDescription = objASPError.Description

strASPDescription = objASPError.ASPDescription

strCategory = objASPError.Category 'type or source of error

strFileName = objASPError.File 'file path and name

strLineNum = objASPError.Line 'line number in file

strColNum = objASPError.Column 'column number in line

If IsNumeric(strColNum) Then 'if available convert to integer

lngColNum = CLng(strColNum)

Else

lngColNum = 0

End If

strSourceCode = objASPError.Source 'source code of line

...

现在构建一个错误报告字符串,这段程序看起来复杂,但实际上仅是一系列If ...Then语句的嵌套,用以产生良好的报告格式,没有任何空的段落。如果错误是语法错误,来自ASPError对象的Source属性的源代码可在strSourceCode变量中得到,可以使用这个变量及lngColNum的值(从ASPError对象的Column属性中得到)增加一个标记用来指明在源程序中的什么地方发现了错误。

...

'create the error message string

strDetail = "ASP Error " & strASPCode & "occurred " & Now

If Len(strCategory) Then

strDetail = strDetail & " in " & strCategory

End If

strDetail = strDetail & vbCrlf & "Error number: " & strErrNumber _

& " (0x" & Hex(strErrNumber) & ")" & vbCrlf

If Len(strFileName) Then

strDetail = strDetail & "File: " & strFileName

If strLineNum > "0" Then

strDetail = strDetail & ", line " & strLineNum

If lngColNum > 0 Then

strDetail = strDetail & ", column " & lngColNum

If Len(strSourceCode) Then

'get the source line so put a ^ marker in the string

strDetail = strDetail & vbCrlf & strSourceCode & vbCrlf _

& String(lngColNum - 1, "-") & "^"

End If

End If

End If

strDetail = strDetail & vbCrlf

End If

strDetail = strDetail & strErrDescription & vbCrlf

If Len(strASPDescription) Then

strDetail = strDetail & "ASP reports: " & strASPDescription & vbCrlf

End If

...

(3) 记录错误

用名为strDetail的字符串变量创建了错误报告后,可以像在第5章中做的那样,采用FileSystemObject对象把它追加到日志文件中。如果成功,布尔型“failed flag”变量将被设置成False。

...

'now log error to a file. Edit the path to suit your machine.

'you need to give the IUSR_machinename permission to write and modify

'the file or directory used for the log file:

strErrorLog = "c:\temp\custom_error.log"

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

Set objTStream = objFSO.OpenTextFile(strErrorLog, 8, True) '8 = ForAppending

If Err.Number = 0 Then objTStream.WriteLine strDetail & vbCrlf

If Err.Number = 0 Then

objTStream.Close

blnFailedToLog = False

Else

blnFailedToLog = True

End If

%>

(4) 跳转到另一个页面

现在准备在网页中创建一些输出。在此之前,需要检查错误细节以确定下一步要做什么。例如,可用ASPError对象的Number或其他属性检查错误类型。在这里,可认为“Type Mismatch”错误不是代码中有错误,可能是由于用户在文本框中输入错误数据产生的。所以不显示这个网页的剩余部分,而是跳转到另一个网页

If objASPError.Number = -2146828275 Then ' 0x800A000D - type mismatch

Response.Clear

Response.Redirect "/" ' go to the Home page

End If

是否决定这样做依赖于你自己的情况以及你打算发现、记录或显示的错误类型。需要注意的是,因为我们不想把目前的网页环境传送到新的网页上,所以选择使用Reponse.Redirect语句而不是用Server.Transfer语句。

(5) 显示错误信息

最后,显示错误报告和其他信息以及返回到上一个网页或主页的按钮。

<%

'see if the logging to file failed

'if so, display message

If blnFailedToLog Then

Response.Write "<B>WARNING: Cannot log error to file '" & strErrorLog & "'</B>.<P>"

End If

'see if we are displaying the error information

If Session("ShowError") = "Yes" Then

%>

<PRE><% = Server.HTMLEncode(strDetail) %></PRE>

<%

End If

'see if we are displaying the debug information

If Session("ShowDebug") = "Yes" Then Server.Transfer "debug_request.asp"

'create the buttons to return to the previous or Home page

strReferrer = Request.ServerVariables("HTTP_REFERER")

If Len(strReferrer) Then

%>

<FORM ACTION="<% = strReferrer %>">

<INPUT TYPE="SUBMIT" NAME="cmdOK" VALUE=" ">

Return to the previous page<P>

</FORM>

<%

End If

%>

<FORM ACTION="/">

<INPUT TYPE="SUBMIT" NAME="cmdOK" VALUE=" ">

Go to our Home page<P>

</FORM>

对上面这段程序需要注意的是:在定制错误页面里,不能使用Server.Execute方法。如果我们这样做的话,至少程序不能正常工作。当程序把执行转到特定的网页时,程序不会再返回到当前网页,这就是我们使用Server.Transfer方法载入显示调试信息的网页的原因。这是下一部分要讨论的问题。

7.5 程序调试——发现及处理错误

读完上面内容,读者一定很想创建一个没有错误的ASP网页。但你可能会发现网页并不能工作。怎么办,只有进行测试。 在这一部分,首先简要看一下能使调试更容易的一些工具。Microsoft Script Debugger试图把调试支持工具提高到像Visual Basic、

Delphi和Visual C++等大多数传统编程环境的水平。然而,下面将首先讨论一些更传统的有助于跟踪出现在网页中的错误的技术。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有