ASP 3.0高级编程(三十二)

编程|高级

7.2.4 客户端脚本错误
到目前为止,我们已了解了来自ASP的错误。然而ASP也经常用于创建包含客户端脚本的网页。如果包含客户端代码的<SCRIPT>元素没有被设置成RUNAT="SERVER"属性,ASP将不考虑服务器,而把网页信息不加改变地传送到客户端。
因此,如果打开了一个ASP网页,并且显示的是一个浏览器错误对话框,就不应该在服务器端寻找ASP程序代码的错误。浏览器看不到ASP程序代码,所以不能识别任何错误,如果有一个对话框出现在客户端,那么在客户端代码中必定有一个错误。
1. 语法错误
如果在网页中的客户端程序代码有语法错误的话,当脚本下载到客户端,浏览器便会出现相应的错误。尽管网页中内容仍可正常载入(除非由这些客户端脚本代码动态装入),但网页停止执行。用户将看到一个包含错误细节的对话框,或者是一个指示网页包含错误的状态条消息。
现代浏览器趋向于隐藏网页脚本错误的细节,而仅在状态条上显示一个小的错误图标。在IE 4.0和IE 5.0中,正常的错误对话框可以通过Internet Options对话框的Advanced页进行设置来激活,如图7-14所示:

图7-14 Advanced页面设置屏幕
处理脚本程序代码中的客户端错误和在服务器端相似,并且通常会更容易些,因为经常可以直接从服务器目录中通过双击来下载网页。一般不需要通过Web服务器和HTTP获得网页来观察浏览器中的结果,其中的唯一不同是一些服务器交互由客户端脚本来完成,如使用RDS的数据绑定或者动态装入。
2. 运行期或语义错误
在客户端脚本中,通常可能会遇到语法错误,也会经常遇到运行期或语义错误。事实上,在客户端,这种现象是很普遍的。因为在客户端不能像服务器端那样对脚本的环境进行控制,不能肯定用户在他们的机器上正运行什么,实际上在服务器上仅能从一些组件如Browser Capabilities中得到大概情况。
所以,使用客户端对象或特殊版本的脚本语言和属性的脚本程序很可能不能正常工作。尽管如此,处理客户端错误和处理服务器端错误是差不多的。
3. 在服务器上创建的客户端程序代码
在错误发生时,作为“客户端对话框对应于ASP错误页面”规则(关于出错的地方)的一个特别的例外是,使用ASP程序代码在服务器上动态地创建客户端程序代码。例如,可能想在ASP中进行求值运算,然后把数据传给运行在客户端的脚本代码,可能最容易的方法是把数据作为一个变量插入脚本代码中:
<%
' get the name of our server from the ServerVariables collection
strServerNameInASP = Request.ServerVariables("SERVER_NAME")
%>

<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var strServerName = "<% = strServerNameInASP %>";

alert('Server name is: ' + strServerName);

// stop hiding code
-->
</SCRIPT>
在客户端,在ASP处理这个页面之后,将得到的是:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var strServerName = "WROXBOX";

alert('Server name is: ' + strServerName);

// stop hiding code
-->
</SCRIPT>
可以忽略RUNAT="CLIENT"属性,但是加上这一项可以使得在查看运行代码的ASP网页时更加清楚。
这样,如果在某个位置想把服务器端数据库中的数据加入到一个客户端数组中,可以采用下面的程序实现:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var arrBooks = new Array(10) //highest available index will be

<% ' start of ASP processing
intIndex = 0
Do While { not at the end of some recordset }
strTitle = { get title from database record }
Response.Write "arrBooks[" & CInt(intIndex) & "] = '" _
& strTitle & "'; " & vbCrlf
intIndex = intIndex +1
{ move to next record in database }
Loop

do something here on the client with the array of book titles

// stop hiding code
-->
</SCRIPT>
这段服务器端ASP程序代码产生的客户端代码,在客户端运行时创建书名标题数组。同时产生的客户端脚本错误出现在浏览器的错误对话框中。错误的原因是以arrBooks命名的数组是由JavaScript代码运行在客户端时创建的,仅能接受9个书名;而服务器端代码能很可能产生多于9个的书名,具体多少由源数据库中的记录数来决定。这相当于如下客户端代码:
<SCRIPT LANGUAGE="JScript" RUNAT="CLIENT">
<!-- hide code from older browsers
var arrBooks = new Array(10) //highest available index will be
arrBooks[0] = 'Instant JavaScript';
arrBooks[1] = 'Professional ASP 3.0 Programming';
arrBooks[2] = 'ADO 2.5 Programmers Reference';

etc

arrBooks[9] = 'ASP Techniques for Webmasters';
arrBooks[10] = 'ASP Programmers Reference'; // <- client-side error occurs here
arrBooks[11] = 'ADSI CDO Programming';
arrBooks[12] = 'Professional MTS and MSMQ Programming';

do something here on the client with the array of book titles

// stop hiding code
-->
</SCRIPT>
这个页面只有经过修正之后才能正常工作,可以通过增加数组大小,也可以通过控制来自数据库的记录数使其正常工作。

7.3 防止错误
上面已经看到了能够出现的一些不同类型的错误,并且有了一些查找错误的感觉。下面将考虑如何避免把错误引入程序中,尽管不能保证所编写的程序没有错误,但是这里概括的许多技术
[1] [2] [3] [4] 下一页  

时间: 2024-12-06 10:13:17

ASP 3.0高级编程(三十二)的相关文章

ASP 3.0高级编程(十二)

编程|高级 4.2.3 服务器端包含指令的例子本节提供了一些示例页面,可以用来对各种服务器端包含语句进行实验.打开示例网页的子目录Chapter04,显示"SSI Directives and the ASP Server Object"主页(即子目录Chapter04中的Default.asp),如图4-3所示: 图4-3 示例网页本书的所有示例都可以从我们的Web网站下载.读者将在示例的子目录Chapter04中发现本章其余部分的所有示例页面.1. 使用SSI/CGI处理指令单击链

ASP 3.0高级编程(十四)

编程|高级 4.3.3 执行其他的网页ASP 3.0和IIS 5.0的新特性之一就是引入了可编程的服务器端重定向(server-side redirection)的概念.这意味着,可以把一个网页的控制和执行转到另外一个网页,而不需要在客户端使用Response.Rdedirect方法.1. 客户端重定向带来的问题ASP编程人员通常使用Response.Redirect语句把一个页面载入到当前正在执行的网页.然而,许多人没有意识到这条语句不会自动地使服务器立即装入和执行新的网页.其真正做的是把一个

ASP 3.0高级编程(十五)

编程|高级 4.3.4 Server对象的错误处理ASP没有错误处理机制一直受到批评.在VBScript中,有一个On Error Resume Next语句,它使脚本解释器忽略运行期错误并继续脚本代码的执行.接着该脚本可以检查Err.Number属性的值,判别是否出现了错误.如果出现错误,返回一个非零值.在ASP 3.0中,也可以使用On Error Goto 0"转回到"缺省的错误处理.在ASP 2.0中实际也进行这种处理,但是没有相应文档说明.在Jscript中,有一个新的错误处

ASP 3.0高级编程(十)

编程|高级 (1) 遍历Contents集合的代码为了遍历Contents集合,可使用一个For Each ... Next结构.集合中的每一项可以是一个简单的Variant类型变量.一个Variant数组或者一个对象的引用.因为需要对每种类型的值进行不同的处理,所以就不得不对每一个进行检查来判别其类型.在VBScript中可使用VarType函数完成这个工作.这里使用IsObject和IsArray函数代替:For Each objItem in Application.ContentsIf

ASP 3.0高级编程(十八)

编程|高级 5.2.5 引用对象类型库在早先的ASP版本中,在脚本中使用对象或组件时,组件内定义的公共常数(如果有的话)在ASP里将不再有效.这意味着我们需要自己声明它们(或等价物)并指定相应的值.例如,当在早期版本的ASP中使用ActiveX数据库对象(ADO)组件时(将在第8章进行详细的研究),不得不用记录集的Open方法加入预定义常数声明.例如:Const adOpenKeyset = &H0001Const adLockPessimistic = &H0003Const adCmd

ASP 3.0高级编程(十九)

编程|高级 5.3.2 Dictionary对象示例本书提供了一系列示例文件可用来试验脚本运行时间库的各种属性.本章代码的缺省页面提供了一系列可使用的VBScript示例链接.有些示例对JScript同样有效.这些示例存放在Chapter05目录下相应的子目录里,显示的界面如图5-2所示: 图5-2 ASP脚本运行期对象示例页面要查看Dictionary对象的运行,在菜单页面点击第一个链接,打开名叫show_dictionary.asp的页面.这个页面显示了我们提供的Dictionary对象的内

ASP 3.0高级编程(十六)

编程|高级 4.3.5 获取Server对象的路径信息在对存储在Web网站上的文件进行操作时,需要获得文件的实际的物理路径,而不是使用虚拟路径或URL,尽管在其他网页中能用它们正常地定位文件.下一章中有一个例子,它使用FileSystemObject对Web站点的InetPub\WWWRoot文件夹中的文件进行读写.当创建自己的定制组件或者使用商业化的组件对文件系统进行访问时,经常需要为其提供一个文件的物理路径.Server对象的MapPath方法可以从Request.ServerVariabl

ASP 3.0高级编程(二十八)

编程|高级 6.2.11 Logging Utility组件Logging Utility组件是ASP 3.0的新组件,提供了访问日志文件的方法,这个日志文件是由服务器支持的用于Web和FTP网站的IIS创建的.1. Logging Utility组件的成员Logging Utility组件提供了六种方法,能读取日志文件的内容.把新记录写进已存在的日志文件中.这些方法和上一章讨论的FileSystemObject对象的方法有相似性,如表6-9所示:表6-9 Logging Utility组件的方

ASP 3.0高级编程(二十九)

编程|高级 6.3.2 SA-FileUP组件在很多Web网站上,一个常规要求是,服务器接受客户机发送的文件的能力如何?在IIS 4.0里,Microsoft提供了一个名为Posting Acceptor组件完成这项工作,IIS 5.0和ASP 3.0的标准安装中没有该组件,如果安装Site Server Express的话,则需要包含这一组件.可以从Microsoft Web网站http://www.microsoft.com/windows/software/webpost/post_acc