欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP 3.0高级编程(三十二)

程序员文章站 2023-08-28 22:34:12
7.2.4 客户端脚本错误        到目前为止,我们已了解了来自asp的错误。然而asp也经常用于创建...
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.  代码的格式化和缩进编排
许多vbscript编程员懒于格式化编排其书写的程序。尽管这并不阻碍程序运行,但这使得查找何处产生了错误变得困难。例如,在前面我们看到的程序中,丢失了一个end if,由于嵌套结构的缩进,错误在哪里是相当明显的:
                            objcounters.remove strcountername
                     response.write "removed counter " & strcountername
              <--- missing end if should be here
       end if
end if
%>
如果程序看起来像下面所示的那样,寻找错误将不是一件易事:
<% if len(request.form("cmdset")) then
strcountername=request.form("lstset")
strnewvalue=request.form("txtset")
if isnumeric (strnewvalue)     then
intnewva