ASP 3.0高级编程(三十一)

编程|高级

7.1.2 语义或“运行期”错误
语法错误的发现和处理是令人烦恼的,但在编程中会遇到一些真正“令人兴奋”的另一类型的错误——语义错误(semantic error)或称“运行期”错误(runtime error)。这类错误仅当运行一个脚本代码或其他程序时才会发现。换句话说完整有效的代码已经通过解释器或编译器的解释或编译,在执行时产生了错误。术语“运行期错误”通过是指语义错误的结果,也就是说这类错误存在于代码的语义中,当代码运行时它们才变成可见的。
这种区别来自于这种事实:程序编译器或解释器在处理程序代码之前必须建立一种内部代码的描述,涉及多种结构开头和结尾的匹配,以便标明每种结构包含什么内容,然后分析每个句子,以便知道如何执行这个句子。例如,如果在程序代码中有一个If Then … Else … End If 结构,解释器或编译器做的第一步工作就是分析哪些语句在“Then”的部分,哪些在“Else”部分。这一步的目的是,在对结构中的If条件进行测试之后,可以决定该到哪个分支去执行。
编译器(诸如在编程语言像Visual Basic和C++中见到的那种)和解释器(诸如用于像VBScript和JScript那样的脚本语言的解释器)之间真正区别在于:编译器不试图运行程序代码,而是在对源程序进行两次预处理后,形成二进制指令或符号代码,并形成一个.exe文件或.dll文件。解释器不含有代码的文件,而是在运行时逐步执行。
1. 使运行停止的错误
如果程序中含有一个语义错误,通常在运行时可得到提示。如果幸运的话,当错误发生时,程序会停止,这样可以容易地找出错误所在。例如,下面这段程序定义了一个有六个元素的数组。
<%
Dim arrValues(5) 'to hold six elements, indexed from 0 to 5
ArrValues(6) = "Whoops, got an error"
%>
如果试图读或设置下标为6的元素值,可以得到一个运行期错误,如图7-7所示:

图7-7 程序执行结果6
注意这里的错误类型是“runtime”(相当于语义)错误,而不是语法错误。错误信息显示了错误所在行数和错误的描述,有助于我们比较容易地找到相应的错误。但这是一个简单的例子,在更复杂的程序代码中,这种错误可能出现在一些遍历一些值并把它们加到一个数组中程序中。如下所示:
<%
Dim arrValues(5) ' to hold six elements
For intLoop = 0 To intListCount ' the number of items in some list
arrValues(intLoop) = Request.Form("SelectedItems")(intListCount)
Next
%>
这种情况下,很可能是得到了过多的列表条目,或者是数组的索引不够,根据代码的要求,可以判断是那种错误,并且能够通过增加数组大小来解决这个错误。
<%
Dim arrValues(10) ' to hold eleven elements
For intLoop = 0 To intListCount ' the number of items int some list
arrValues(intLoop) = Request.Form("SelectedItems")(intListCount)
Next
%>
或者相应地设置循环的参数来解决处理这个错误。
<%
Dim arrValues(5) ' to hold six elements
IntArrayMax = intListCount
If intArrayMax > 5 Then intArrayMax = 5
For intLoop = 0 To intArrayMax ' only add the first six items
arrValues(intLoop) = Request.Form("SelectedItems")(intListCount)
Next
%>
许多其他运行期错误能够使网页运行停止,诸如一些组件或对象的实例化失败,原因是有ProgID错误,或者是因为组件没有正确安装。在这些情况下,结果总是给出“ActiveX Cannot Create Object”错误提示信息,后面跟着调用Server.CreateObject方法的行号。
2. 产生错误结果的错误
上面提到,如果遇到一个使程序代码停止的运行期错误,我们可能是幸运的。但是另一种情况是程序能很好地执行,好像什么也没有发生,最后产生一个错误的结果。这是最难发现和解决的错误,因为意识不到哪里出错了。例如,假设有一个网页,这个网页把用户的生日作为日期型的值,并且单独显示日期元素(可以把它们作为三个条目加到一个数据库中)。
<%
' get the value from the Request and display it
datBirthdate = Request.Form("Birthdate")
Response.Write "The value you entered is: " & datBirthdate & "<P>"

' get the individual date elements
intDay = Day(datBirthdate)
intMonth = Month(datBirthdate)
intYear = Year(datBirthdate)

' and display them
Response.Write "Day: " & Cstr(intDay) & "<BR>"
Response.Write "Month: " & Cstr(intMonth) & "<BR>"
Response.Write "Year: " & Cstr(intYear) & "<BR>"
%>
图7-8是结果,是用美国日期风格月/日/年显示的,好像一切都没有问题。

图7-8 显示生日的屏幕
然而如果输入一个非法日期,或者让输入文本框空着,便得到一个运行期错误,如图7-9所示:

图7-9 错误提示屏幕
(1) 如果不是一位JScript专家
在寻找错误时,这不是一个大问题,因为我们能够迅速发现为什么会出现错误。事实上网页停止运行有助于我们跟踪错误。然而意外的错误可能会发生。例如,用JScript重写程序代码,由于不是一位JScript专家,里面出现一些细小错误。
<%
// get the value from the Request and display it
var datBirthdate = new Date(Request.Form("Birthdate"));
Response.Write("The value you entered is: " + datBirthdate + "<P>");

// get the individual date elements
intDay = datBirthdate.getDay();
intMonth = datBirthdate.getMonth();
intYear = datBirthdate.getYear();

// and display them
Response.Write("Day: " + intDay.toString() + "<BR>");
Response.Write("Month: " + intMonth.toString() + "&
[1] [2] [3] 下一页  

时间: 2024-10-27 17:08:58

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

ASP 3.0高级编程(十一)

第四章 服务器进程和ASP Server对象前面的章节已经研究了ASP的一些内置对象.重点介绍的对象有Request.Response.Session和Application对象.ASP中另一个比较主要的对象为Server对象.本章重点介绍这个对象的背景知识和使用方法.Server对象在服务器端脚本中通过实例和使用其他外部对象和组件,提供了一种扩展ASP页的功能的方法.事实上,许多人认为这个对象是ASP之所以能够流行的主要因素.引入Server对象的意义很大,这意味着ASP不必提供人们所需要的所

ASP 3.0高级编程(三十三)

编程|高级 7.4.2 VBScript错误处理在VBScript中,可以使脚本解释器不处理其找到的任何错误,并且使用On Error Resume Next语句继续运行下个语句.一旦这个语句已被处理,脚本引擎将继续运行后面的程序,而不理会已经发现的任何错误.然而,这种过程仅适用于顺序执行语句的环境,换句话说,不适用于嵌套的函数或子程序.1. 使用On Error Resume Next语句一个错误在子程序中出现时,如果没有运行On Error Resume Next语句,那么错误将被交给调用它

ASP 3.0高级编程(三十二)

编程|高级 7.2.4 客户端脚本错误到目前为止,我们已了解了来自ASP的错误.然而ASP也经常用于创建包含客户端脚本的网页.如果包含客户端代码的<SCRIPT>元素没有被设置成RUNAT="SERVER"属性,ASP将不考虑服务器,而把网页信息不加改变地传送到客户端.因此,如果打开了一个ASP网页,并且显示的是一个浏览器错误对话框,就不应该在服务器端寻找ASP程序代码的错误.浏览器看不到ASP程序代码,所以不能识别任何错误,如果有一个对话框出现在客户端,那么在客户端代码中

ASP 3.0高级编程(三)

访问和更新Cookies集合Cookies的值比ASP其他集合(例如Form和ServerVariables)的值要复杂得多.Cookie是一小块由浏览器存贮在客户端系统上的文本,且随同每次请求发往它们应用于的域中的服务器.ASP使得应用cookie较为容易,可以从Request对象的Cookies集合中获得所有随同请求发出的cookie值,并可创建或修改cookie,通过Response对象的Cookies集合发回给用户.Cookie包含可用两种方式构造的信息,单值cookie提供其值给代码是

ASP 3.0高级编程(十七)

编程|高级 第5章 脚本运行期库对象前面章节已经介绍了ASP如何使用在服务器上定义的对象的实例,充分利用所提供的方法和属性扩展ASP的性能.有一系列的对象可供使用,包括脚本对象和标准IIS/ASP安装的组件,以及自己创建的或者从其他供应商处购买的对象.也可以在互联网上各种网站免费下载对象,并在自己的页面上使用.这一章将讨论由ASP脚本环境提供的一般称为"脚本运行期库"(Scripting Runtime Library)的对象.这些对象通过正在使用的脚本引擎提供给代码,与ASP脚本程序

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

ASP 3.0高级编程(四十)

编程|高级 8.5.1 Errors集合Errors集合包含由单个ADO命令的执行而引起的每一个错误的Error对象.使用Errors集合的原因是由于在一个命令的执行过程中,可能会引起多个错误,OLE DB提供者需要提供一种方式通知客户方已有多个错误发生.关于Errors集合有两个重要的地方需要注意:· 每次执行ADO命令,如果发生错误,就清空错误集,同时代之以新的错误内容.当然,如果没有错误发生,Errors集合不会受到影响.所以,即使ADO命令成功执行,这个集合中也可能含有错误信息.· OL

ASP 3.0高级编程(五)

编程|高级 1. 操作HTTP报头我们已经在几处见到ASP如何创建或修改在响应页面请示时被发送到客户的HTTP报头.在Response对象中有几个属性和方法可帮助我们做到一点.下面是一些报头方法:· 控制缓存和有效期.· 创建状态和定制的HTTP报头.· 指定MIME类型或内容类型.· 添加PICS标签.接下来将简要地研究每一个方面.可在"Response Object"主页(show_response.asp)上,单击相关属性名或方法名,来检查我们所说的属性和方法,如下图所示: 1.

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中,有一个新的错误处