<marquee width=358>欢迎来到月影社区,希望这里可以成为您美丽的梦幻花园,如果你觉得这里好请分享给您的朋友!- wf66.com</marquee> 将月影社区设置为您的首页将月影社区地址加入到您的收藏栏
月影社区时尚音乐音乐查询IP手机许愿之瓶最新更新文件加密访客留言爱音乐
欢迎您,首页 >> 信息中心 >> ASP 3.0高级编程(三十)

请输入您关键字:


ASP 3.0高级编程(三十)

推荐查看本文HTML版本


第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.
       实际上得到的结果如图7-1所示:
图7-1  程序执行结果1
       豆豆注:
              如果你的错误提示信息无法出现“语法错误”,请将你的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个字符之后,可以找到语法错误的地方,这里明显缺少了一个双引号。加上双引号后再运行这个页面,我们可以得到如图7-2所示:
图7-2  程序执行结果2
       这次又是另外一个简单错误。实际上错误出现在第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)
实际得到的结果如图7-3所示:
图7-3  程序执行结果3
这是因为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)[月影读书频道 http://wf66.com/]
              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
%>
产生的错误如图7-4所示:
图7-4  程序执行结果4
为什么提示在网页程序中需要一个End语句呢?看一下程序就可以发现,丢失了一个End If,而不是End,在程序的最末尾应该还有另一个End If。[月影社区 http://wf66.com/]
                     …
                     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”(对象不支持这种属性或方法)错误,如图7-5所示:
图7-5  程序执行结果5
原因很简单,返回月份数的JScript函数是getMonth,而不是GetMonth。下面这段程序就可以正常运行。
<%
var datToday = new Date();
Response.Write(datToday.getMonth());
%>
当然,如果重试这段程序,可能得不到同样的错误消息。我们第一次运行这段程序时,得到如图7-6所示的错误。
图7-6  程序执行结果6
第2行有什么错误?如果使用JScript解释器,没有错误出现。错误消息说明,这是一个VBScript语法错误。用VBScript解释器分析JScript程序,所以会得到奇怪的错误消息。
记住正在使用语言
这所以出现上述错误是因为在页面的代码前面忘记加@LANGUAGE指令。缺省是VBScript(如果在注册表或在Internet Services Manager中没有改变它),所以VBScript引擎用于处理前面不带@LANGUAGE指令的程序。即使一直使用专为自己的服务器设置的缺省语言,始终使用@LANGUAGE指令是避免产生上述错误的好方法。这样,如果把网页移到另一个缺省语言不同的服务器上,也会得到预期的结果。
这里讲述的内容不可能覆盖所有可能遇到的语法错误,人们往住想知道为什么会出现错误,而错误信息提示并不总是像人们希望的那样准确。理想的方式应该是ASP给我们提供一个简洁的错误显示页面,有对错误的全面精确的描述,甚至询问我们是否想自动处理错误。事实上应用程序Microsoft Script Debugger正试图为我们提供类似的功能,本章后面要对其进行讨论,也要概括避免出现语法错误的一些要点。现在,我们继续研究经常在网页中出现的第二类错误.

ASP 3.0高级编程(三十) 2006-9-8
转到本主题第:[ 1 ]
相关评论

暂无评论

总计0页 [ ]上一页 下一页
发表评论(揪错)
呢称: * 您尚未登陆,请登录
来自: *
内容:
 

(为防止非法信息,您的言论提交后需要审核才能正常显示)

文学
精品文萃 情感天地 言情小说
网络小说 玄幻小说 悬疑恐怖
武侠小说 古典品谈 外国名著
儿童文学 会员原创 学习园地
杂谈其它
娱乐
爆笑网文 星座占卜 影音动漫
娱乐新闻 影视剧情
诗词
青竹诗歌 个人诗集 宋词雅赏
全唐诗录
新闻
国际新闻 国内新闻 科技新闻
体育新闻
图片
图文专区 艺术长廊 桌面壁纸
精品素材 像素图片
漫画
单幅漫画 爆笑四格 连环漫画
电脑
电脑入门 图形图像 编程开发
游戏
我爱Q宠 最新攻略 最新秘籍
游戏新闻 技巧心得
经济
帕格节电 财经资讯 股市证券
生活
百科知识 外语学院 潮流时尚
健康医疗 宠物花卉 汽车地带
行走天下
美食
面食甜点 家常菜品 药膳食疗
美食天下 烹饪技巧 松辽风味
燕京风味 巴蜀风味 滇黔风味
赣江风味 徽皖风味 闽台风味
齐鲁风味 中州风味 岭南风味
荆楚风味 三晋风味 淞沪风味
苏扬风味 潇湘风味 钱塘风味
民族风味 素斋仿荤
营销
管理杂谈 谈经论道 培训激励
经营战略 职场生涯 公关交际
关于我们版权声明本站导航友情连结作品演示 TOP↑
本论坛言论纯属发表者个人意见,与£月影社区£立场无关。 皖ICP备16024038号-1
禁止发布任何色情/政治/反动相关信息让我们共同来营造一个属于我们的梦幻家园
Copyright ©2001-2006 MoonShadow. All rights reserved.  Version 4.0  Licence 2006.4.2
建站天数:7135天 本站基于ASP+JS构建,完全自主开发,版权归属月影社区 管理员QQ:23165062 Time:93ms