分享
 
 
 

ASP 3.0高级编程(三十)

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

第7章 调试和错误处理

前面已经介绍了使用ASP所需要的基本技能,本章要讨论的另外一个问题是当ASP出现错误时怎么办,ASP出错时是什么情况。当精心编排的ASP页面出现问题停止了执行时,用户一般得到的仅是一些用处不大的建议,诸如:点击“刷新”按钮,或者“与站点的Web管理员联系,告诉他们你的页面不能正常工作了”等等。

本章除了提供有用的信息外,还想提供一个帮助区域。我们将详细介绍在脚本和页面中错误如何出现,可能产生的错误类型,以及什么造成了这些错误。更重要的是,要讨论如何尽可能避免错误的发生,如不能避免又如何妥善处理。

因此,本章将要探讨页面调试技术,也就是如何花费不多的精力和时间就能找到错误并解决问题。

本章包括以下内容:

· 能够出现的错误类型。

· 如何防止各种错误的产生。

· 如果不能防止错误发生,如何妥善处理这些错误。

· 如何发现和处理脚本错误及其他类型的错误。

· 如何使用定制的错误页面得到错误信息。

· 如何记录发生的错误以监视我们的网站。

· 创建一个定制错误网页和一个错误日志文件。

· 提供相关的在线帮助。

本章不涉及如何处理使用ActiveX Data Objects(ADO)访问数据源时出现的各种特殊类型的错误。像许多组件一样,ADO提供了自己的错误处理系统,第8章将深入讨论这一点。本章将从讨论能出现的各种错误类型开始,使我们能够认识这些错误并采取相应的措施。

据说,在非洲最黑暗的雨林深处,有这样一群程序员,他们的程序代码从来没有出现过错误。但是,很遗憾他们从没有享受过调试一段不能正常工作的应用程序的乐趣。调试程序代码是一个真正充满快乐的工作,所以我们要面对这个问题,在调试程序的过程中检验我们的观察力和横向思维能力。大多数“真实世界”的程序员能够体验这些乐趣是一件好事。

当然,有些人会说,调试程序与其说是判断,不如说是碰运气。花费了许多时间去调试一段有错误的程序,在某种程度上可以说确实是依赖运气。但是,如果第一步从合适的地方开始查看,可能会更快地解决问题。

但这不是程序调试应采取的办法。从理论上讲,当某段程序运行失败时,应该以逻辑或顺序方式跟踪错误。作为一个聪明和有经验的程序员,这才是调试时常用的方法,只有业余人员才随意改变程序中变量的值,到处添加Response.Write语句进行调试。

然而,为了能够在逻辑上跟踪程序中的错误,必须了解有关错误如何出现方面的基础知识,更重要的是知道错误出现在哪里,以便很快就能找到相应的地方。本章讨论的内容是有关程序中能够出现的不同种类的错误,错误的不同表现,以及如何记录和排除这些错误。同样重要的是,还将介绍如何避免这些错误的发生。

本章将从介绍可能出现的不同种类的错误开始,如果认为你的代码不会出现任何错误,可以直接跳到下一章。

7.1 错误的种类

7.1.1 语法或“编译”错误

当我们第一次运行新编写的程序代码时,通常看到的第一种错误类型是“syntax error”。这就是所说的,程序代码上的语法错误。这就像在写作中使用了错误的语法,使读者不能了解其中的含义。而解释器(诸如脚本引擎)和编译器对语法要求得更加严格和准确。

语法错误通常也是最早出现和需要排除的。大多数情况下,解释器和编译器会指出行号和所在行中的字符位置,以及在相应的位置上缺少的内容。下面举一个简单的例子,如下所示的这样一段程序:

<%

Response.Write "The repayments for your loan are $" & chrPayment _

& " per " & strInterval & , due on the " &strDay & " of each "

& strInterval & "."

%>

我们希望得到下面的结果:

The repayments for your loan are $124.50 per month, due on the 12th of each month.

豆豆注:

如果你的错误提示信息无法出现“语法错误”,请将你的WINNT\Help\iisHelp\common\500-100.asp做如下改变(加了两行黑体字):

...

Dim bakCodepage

bakCodepage = Session.Codepage

Session.Codepage = 936

Response.Write Server.HTMLEncode(objASPError.Category)

If objASPError.ASPCode > "" Then Response.Write Server.HTMLEncode(", " & objASPError.ASPCode)

Response.Write Server.HTMLEncode(" (0x" & Hex(objASPError.Number) & ")" ) & "<br>"

If objASPError.ASPDescription > "" Then Response.Write Server.HTMLEncode(objASPError.ASPDescription) & "<br>"

blnErrorWritten = False

Response.Write "<B>"

If objASPError.Description > "" Then Response.Write Server.HTMLEncode(objASPError.Description) & "<br>"

' Only show the Source if it is available and the request is from the same machine as IIS

文件中第3行是Response.Write语句的第2行。报告错误信息时,VBScript解释器忽略一行中的引导空格和制表符。所以在数完26个字符之后,可以找到语法错误的地方,这里明显缺少了一个双引号。加上双引号后再运行这个页面

这次又是另外一个简单错误。实际上错误出现在第3行而不是第4行。我们漏掉了第三行末尾的续行符'_'。程序代码应该是:

<%

Response.Write "The repayments for your loan are $" & chrPayment _

& " per " & strInterval & ", due on the " &strDay & " of each " _

& strInterval & "."

%>

||||||1. 错误出现在什么地方

需要注意的是脚本解释器仅指出所发现错误的地方,但实际上那儿并不一定是错误真正出现的地方。在上例中,前面三行的语法正确的;并产生相应的输出结果,而恰恰是第4行引起问题,因为这一行是以一种非法字符开头的,脚本解释器没有意识到这一行是上一行的一部分。

这样的错误是普遍存在的,因为通常我们主要考虑的是要输出的文本内容,而不是双引号、连字符(在VBScript中为“&”)、续行符等的正确顺序。

对于关键字、内部函数名拼写错误或函数的非法参数列表而引起的语法错误,通常比较容易发现,因为错误信息提示可能就指出了错误的实际位置。例如:下面这段代码是想把明天的日期写入页面。

Response.Write DateAdd(Now(),"d", 1)

这是因为DateAdd函数的语法应该是:

DateAdd (interval_string, interval_number, start_date)

所以应该改写为如下的代码:

Response.Write DateAdd("d", 1, Now())

脚本解释器检测到了我们为第二个参数提供的是一个字符型数据,而DateAdd函数需要的是整型数据类型。

代码结构和脚本结构

语法错误的另一个原因是:当制作网页时使用嵌套的或复杂的脚本结构,如If Then … Else … End If或者Do While … Loop。这有时会造成难以找到的语法错误。

例如下面这段程序:

<%

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

strCounterName = Request.Form("lstSet")

strNewValue = Request.Form("txtSet")

If IsNumeric(strNewValue) Then

intNewValue = Cint(strNewValue)

objCounters.Set strCounterName, intNewValue

Response.Write "Set counter " & strCounterName & " to " & strNewValue

Else

Response.Write strNewValue & " is not a valid number"

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

strCounterName = Request.Form("lstRemove")

objCounters.Remove strCounterName

Response.Write "Removed counter " & strCounterName

End If

End If

%>

为什么提示在网页程序中需要一个End语句呢?看一下程序就可以发现,丢失了一个End If,而不是End,在程序的最末尾应该还有另一个End If。

Response.Write "Removed counter " & strCounterName

End If

End If

End If

%>

在这种情况下,根据代码的缩排格式可以很容易地找到相应的错误。特别当错误信息指出错误的大致位置时,很快就可以找到错误位置。然而,这段代码很短,如果在分界符<%…%>中另外还有40行代码,那么错误行号仍然可能指向最后一行(line 56);并且如果在新的代码中的其他脚本结构搞乱了嵌套的结构,错误可能会指向另一个位置。

2. 关于JScript

如果你不是一位JavaScript高手,并且确实想试验一些语法错误,那么就从VBScript切换到JScript。JScript比VBScript对程序编写的要求更严格,并且对关键字和变量名大小写敏感,看下面的程序段。

<%

var datToday = new Date();

Response.Write(datToday.GetMonth());

%>

运行这段程序会产生“Object doesn’t support this property or method”(对象不支持这种属性或方法)错误

原因很简单,返回月份数的JScript函数是getMonth,而不是GetMonth。下面这段程序就可以正常运行。

<%

var datToday = new Date();

Response.Write(datToday.getMonth());

%>

当然,如果重试这段程序,可能得不到同样的错误消息。我们第一次运行这段程序时

第2行有什么错误?如果使用JScript解释器,没有错误出现。错误消息说明,这是一个VBScript语法错误。用VBScript解释器分析JScript程序,所以会得到奇怪的错误消息。

记住正在使用语言

这所以出现上述错误是因为在页面的代码前面忘记加@LANGUAGE指令。缺省是VBScript(如果在注册表或在Internet Services Manager中没有改变它),所以VBScript引擎用于处理前面不带@LANGUAGE指令的程序。即使一直使用专为自己的服务器设置的缺省语言,始终使用@LANGUAGE指令是避免产生上述错误的好方法。这样,如果把网页移到另一个缺省语言不同的服务器上,也会得到预期的结果。

这里讲述的内容不可能覆盖所有可能遇到的语法错误,人们往住想知道为什么会出现错误,而错误信息提示并不总是像人们希望的那样准确。理想的方式应该是ASP给我们提供一个简洁的错误显示页面,有对错误的全面精确的描述,甚至询问我们是否想自动处理错误。事实上应用程序Microsoft Script Debugger正试图为我们提供类似的功能,本章后面要对其进行讨论,也要概括避免出现语法错误的一些要点。现在,我们继续研究经常在网页中出现的第二类错误。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有