欢迎光临
我们一直在努力

ASP 3.0高级编程(三十五)

建站超值云服务器,限时71元/月

7.5.1 常规调试技术

在第2章中,已经看到如何使用response.write方法以及request集合来显示集合的内容。如果代码要使用来自请求的值,首先要做的是保证所需的值存在。很容易出现的问题是错拼或改变的<form>网页中html控件的名字,或者创建附加在url后面的查询字符串时出现了错误的客户端。

1. 显示各种集合内容

当程序试图使用用户提供的值运行时,可能没有得到所期望的结果,或者什么结果也没得到。记住,引用request对象的集合中一个并不存在的值(例如,在窗体上没有一个名为“thiscontrol”的控件时,使用request.form("thiscontrol")不会引起错误。结果可能只得到一个空字符串。如果期望查找存储在用户的session对象或全局application对象变量中的数值,同样可能出现这种情况。

如果创建一个页面用来显示所有request对象集合、session和application对象的contents和staticcontens集合的内容,可以任何网页使用server.execute对其进行访问。所需要做的工作是把下面程序行加到asp网页中,用来显示集合的全部内容。当然,根据服务器上文件存放的位置,必须给文件设置相应的路径。

<% server.execute "/path_to_file/debug_request.asp" %>

这是一种很好的方法,保证我们希望在request、session和application集合中找到的任何值确实存在,并且包含了合适的值。在本书的示例文件chapter07子目录中提供了一个相应的文件,取名为debug_request.asp。它基本上是用于第2章的show_request.asp网页和用于第3章的show_application.asp和show_session.asp网页的一个组合,但删除了部分html程序代码。它只是简单地遍历了集合并把值放到当前页面中。

可以通过运行“custom error page”实例来查看这个页面。这个实例在本章前面看到过,打开时请选中“display debugging information”复选框,或者直接在chapter07目录中的主菜单网页中打开。

2. 显示中间值

在网页中查看运行情况的第二个方法是显示网页运行时变量的值.当大概知道了错误来自何处,哪个变量在起作用时,这种传统技术还是不能废弃的。但由于iis 5.0网页缓冲方式的改变,使得使用这项技术比较困难。

在asp和iis的先前版本中,缺省时关闭页面缓冲,并且几乎没有人想到将缓冲打开(使用response.buffer = true打开),除非想使用response.redirect完成网页的再定向(参看第2章)。响应多个请求时,由于缓冲减小了网页间切换的次数,从而提高了iis的效率。

然而,当出现一个使运行停止的运行期错误时,iis自动调用response.clear方法,再调用server.execute来装入定制错误网页,因此写进网页的任何输出都丢失了。解决方法是暂时增加下面的程序行:

<% response.buffer = false %>

此程序行放在页面顶部<@language…>指令后面,任何由response.write语句生成的调试输出将出现在定制错误网页的顶部。记住在完成网页调试之后将它去掉。

强行使程序运行通过一个错误点,然后显示可疑的变量值,这种方法有时也是有用的。只需在网页开始处附近增加on error resume next语句,然后就能访问err对象(在vbscript中),并显示错误号、错误源和描述。

3. 检查组件属性值

如果使用的组件具有在asp脚本代码中设置的属性,在完成设置之后,并且调用组件方法之前和之后,能通过显示所有属性(或仅是可疑的属性)来跟踪错误。当一个方法运行时,可能发现属性值意外地被组件改变了,这或许是故意的,或者是因为组件中的缺陷。没有亲自检查实际代码,不要做任何假设。

7.5.2 microsoft script debugger

当开发更复杂的处理实际任务的应用程序时,经常需要一个更加强大的工具来进行调试。microsoft script debugger(微软脚本调试器)是一种允许调试运行在客户机和服务器上的脚本的调试工具。它能用于任何启用activex的脚本语言(包括vbscript和jscript)编写的程序,也能够用来调试对java applet、java bean和activex组件的调用。

在研究这个工具之前,先简要说明一些问题。如前所述,asp应用程序由两种脚本组成,一种是客户端脚本,一种是服务器端脚本。客户端脚本通常由vbscript或jscript脚本语句组成,当其到达客户端时出现在html页面中并在此执行,可能是在载入文档时或是在对一些事件的响应中。服务器端脚本通常也由vbscript或jscript语句组成。当浏览器请示网页时,服务器端脚本由iis执行。在下面的讨论中,将讨论服务器端脚本调试的方法。然而所讨论的许多技术也可用于客户端脚本调试。

1. 服务器端的调试

为了调试服务器端脚本,在运行iis的计算机上运行脚本调试器,然而在使用脚本调试器之前,必须启用调试。为了使性能最优化,基于asp的应用程序在缺省情况下关闭了调试功能。

注意,不要对生产性的应用程序(即处于活动状态的并被他人使用的公用网站)打开调试功能。这样会减慢整个应用程序的运行,并且错误能使网页出现不确定的停止运行情况。

调试仅能为虚拟应用程序和整个web网站进行设置,为了启用调试,打开应用程序或站点的properties对话框,在home directory选项卡中,点击configuration按钮,在application configuration对话框的app debugging选项卡中,选择enable asp server-side script debugger,如图7-22所示。下面准备调试我们的应用程序。

图7-22 启用调试的屏幕

注意application configuration对话框包含一个复选框,能够启用客户端脚本调试。这一点在iis 5.0中没有实现,在文档中仅标记为“reserved for future use”。如果通常的500-100.asp定制错误页面不可用,script error messages部分中包含将文本。

(1) 处理服务器脚本

不像客户端脚本,基于asp应用程序脚本不是事件驱动的。当客户端要求一个来自服务器的网页时,服务器读取网页内容,并处理所有的服务器脚本(即在<%…%>和<script runat="server"></script>段中的所有内容),也包括在html文本中的“行内”脚本段内容,例如:

the valve of the result is: <% = strresult %>

处理流程显示在图7-23所示的框图中:

图7-23 服务器脚本运行流程图

当iis载入网页时将处理asp页面中的所有脚本,在任何输出送给客户端之前,asp及脚本引擎能够捕获语法和运行期错误(除非你关闭缓冲或调用response.flush方法)。

(2) 脚本调试器提供的帮助

启用脚本调试时,如果出现错误,在服务器屏幕上可以看到一个描述asp代码错误的对话框,点击ok,然后调入当前asp网页的一个只读拷贝,打开的脚本调试器,错误出现的行由箭头指示,如图7-24所示:

图7-24 脚本调试器

这里,错误的产生是由于出现了page counter对象方法的名字错误,应是pagehit而不是dopagehit。同时,脚本调试器找到了错误并且终止了页面的运行,工具条上的按钮用于程序的继续运行、单步程序运行或者终止页面的处理。

工具条最右边的按钮打开脚本调试器中的immediate窗口,可以用它和页面进行交互,并且很可能找到出错的地方。例如,可以查询或者设置变量值或组件属性,可以执行内部函数和子程序、自定义函数和子程序以及已经创建的对象方法等。在图中,调用了page counter组件的pagehit方法,然后查询hits属性以得到正在运行的脚本中该处的值。

为了了解为什么在“公共”网站上不应使用脚本调试器,可以从客户机上打开一个包含服务器端错误的页面。在这种情况下,错误信息对话框出现在服务器上,脚本调试器也在服务器上打开。在客户机上,直到运行在服务器上的脚本调试器关闭,才开始载入该页面。

(3) 启动和使用调试器

启用脚本调试后,虚拟应用程序的网页中出现错误时,脚本调试器自动启动。还可以人工启动脚本调试器,在windows 2000的start菜单(programs|accessories|microsoft script debugger)中完成。相应地,也可在想打开脚本调试器的地方把一个stop语句插入asp程序中,当运行至stop语句时,iis会终止asp程序的执行,启动脚本调试器,显示当前页面并指出含有stop语句的当前行。

脚本调试器能完成下列工作:

· 查看正在或已经运行的文档的列表,并从中选择一个进行查看或编辑。

· 在打开的网页中设置一个新断点,页面在该点停止运行以便进行调试。

· 单步调试,一步运行一条语句,可选地执行子程序和函数。

· 查看调用栈(call stack),显示程序中在该点被调用的嵌套子程序或函数。

1. 脚本调试器的技巧和窍门

下面是使用microsoft script debugger时,有助于找到脚本中错误的一些窍门。

· 如果调试服务器端脚本,为asp应用程序启用脚本调试器。否则,错误信息将作为文本传送给客户端的浏览器,并且不能对服务器端脚本使用脚本调试器。

· 调试完成后,关闭调试功能,否则会降低服务器性能,并且错误的页面会停留在客户端。

· 对于一个或更多的asp应用程序,如果启用脚本调试器,将传送给它所有的服务器错误,包括那些远程客户访问网页时出现的错误。因此,除非能在自己的服务器上调试,否则不要启用脚本调试器。

· 如果在一个没有安装在服务器上的浏览器中工作,并且在网页中显示错误,则错误在服务器端脚本中。如果一个错误信息出现在对话框中,则错误在客户端脚本中。

· 如果在.asp文件中有一个语法或运行期错误,并且已经对这个asp应用程序启用调试功能,客户端浏览器将不显示语法错误(除非浏览器运行在服务器上),仅显示超时或不能打开网页。

· 在表明服务器端脚本中是否有错误的消息中,显示的行号指的是包含这个错误的.asp文件的相应行。

· 如果在由.asp文件创建的客户端脚本中有错误,行号并不指向.asp文件的错误行,而是指向错误出现的.asp文件的html输出行。为了查看这行,应在客户浏览器中查看html文件的源程序。

· vbscript和jscript错误代码在附录d中。

7.5.3 获得asp的帮助和支持

如果遇到一个不能处理的错误,或者看来像asp中的一个“bug”的事情,最好能够寻求帮助以解决这个问题。关于asp在web上有许多有用的信息源,第1 章后面我们列举了许多。但是,对一些特殊问题,确实需要一些更直接的帮助。

在计算机上安装的asp和iis文档是一个好起点,并且能通过浏览器的url为http://yourservername/iishelp/进行访问。运行windows 2000的附加组件设置或主设置程序(依赖于安装的windows 2000版本)时,应保证安装了全部的文档。

也可以从“microsoft for windows 2000”得到的完整平台sdk,其中包含了大量关于windows和windows 2000中internet服务的附加信息。它包含完整的vbscript和jscript参考。它可以从微软获得,并提供给msdn成员。脚本参考文档可单独获得,也可以从“http://www.microsoft.com/scripting/”网站下载。也可从这里获得脚本调试器。

微软开发者网络(the microsoft developers network,msdn)web站点也提供了许多支持和帮助,即使这部分信息有时难以找到。还可以从workshop网站(http://msdn.microsoft.com/workshop/)开始,这个网站在左边导航栏中有很好的索引和一系列标题。

另外,位于http://msdn.microsoft.com/library/default.htm的主msdn库包含有文章、基础知识、faq和其他用于iis和asp的支持材料,左边窗口使用一个java扩展列表控件,使用户很容易进行查找。

如果需要特别的帮助,或者需要向其他开发者提出一些问题,在msnews.microsoft.com网站上有一些有用的新闻组。还可以订阅microsoft.public.inetserver.iis、microsoft.public.inetserver.activeserverpages和microsoft.public.inetserver.iis.misc。一些asp网站也提供有关asp方面的讨论话题、论坛或聊天室。

7.6 小结

本章讨论的内容是大多数编程者最不喜爱的工作。即使最简单的脚本,也不可能就能第一次正确地工作。随着asp提供越来越多的特性,在脚本中出现错误的机会也增加了。了解如何发现并处理错误的相关基本知识,是非常必要的。

通过分析可能出现的不同种类的错误,弄清楚缺省的asp和脚本引擎错误处理系统捕获错误的机理,防止把错误和无效数据传给其他的应用程序。编程时出现的错误越少,越容易发现和解决它们。

然而,好的编程习惯并不能阻止某些种类的错误发生,例如那些由外部资源和服务造成的错误。这意味着提供自己的定制错误处理代码,在出现错误时知道如何跟踪错误并进行妥善处理,是非常重要的。

最后,以对microsoft script debugger的阐述结束了本章,它是有助于找到和解决网页中的运行期错误的一个有用的工具。它可以暂停程序执行和进行单步执行,同时还能够观察程序在进行什么,甚至能够和脚本进行交互。

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » ASP 3.0高级编程(三十五)
分享到: 更多 (0)