|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
Access是一种桌面数据库,只适合数据量少的应用,在处理少量数据和单机访问的数据库时是很好的,效率也很高。但是它的同时访问客户端不能多于4个。access数据库有一定的极限,如果数据达到100M左右,很容易造成服务器iis假死,或者消耗掉服务器的内存导致服务器崩溃。毛病
本章后面部分展现了一些成绩,包含毛病怎样呈现、怎样寻觅毛病和怎样处置毛病等等。如今更主要的是要把握可以产生分歧品种的毛病,而且怎样辨别这些毛病。必要记着的是,假如晓得了到那里往找和寻觅甚么,调试则是对照简单的。在本章最初,将先容毛病的确呈现时怎样捕捉毛病,而且要尽量早地制止毛病的产生。
在进修这些内容之前,起首要深切懂得一下在某阶段一定会碰到的分歧范例的运转期和语义毛病,次要会商以下内容:
·逻辑毛病。
·剧本运转期毛病。
·ASP和SSI运转期毛病。
·客户端剧本毛病。
7.2.1逻辑毛病
逻辑毛病在剧本中一般难于跟踪,由于这些毛病经常是发生毛病的了局而不中断网页运转。一般只要一些值呈现超越界限的情形,如在后面数组实例中看到的那样,毛病才展现出来。
但是,在毛病和调试情况中,一种算法其实不像数学课上所学的那样庞大。从盘算的角度看,算法只是指一段能完成某个义务(一般前往某个了局)的程序。
1.数值超界(数据溢出)
典范的逻辑毛病一样平常触及到数值,大概是触及数据溢出等。比方,假如着名为image1.gif、image2.gif等一系列图象,编写以下一段程序随机选择一幅图象用以显现:
<%
createarandomnumberbetween1and5
intRandom=CInt(Rnd()*5)+1
%>
但是,假如可巧这段程序发生的了局是image6.gif文件。在这类情形下,假如原本仅但愿失掉在1~5中的一个了局,网页会是一个破裂的图象标记。缘故原由是VBScript中的CInt函数将值取整到比来的整数值。为了舍往小数部分,必要利用Int大概Fix函数取代CInt。
2.运算标记的优先级
其他范例的逻辑毛病有按指令盘算而呈现的毛病,比方想用除法时接纳了乘法会发生毛病的了局。而因为程序中数学运算标记的运转按次或优先级,会引发一些更难发明的毛病,比方,上面这段程序大概会发生不准确的了局。
intResult=intValue1*intValue2+intValue3
由于乘法比加法有较高的运算优先级,以是先辈行盘算。可是假如想把第一个数和后两个数的和相乘,必需用括号来改动这类缺省的运算优先权。
intResult=intValue1*(intValue2+intValue3)
在VBScript5.0文档中的VBScriptBasics|VBScriptOperators中,给出了一切剧本运转标记的优先级表。关于JScript,在JScriptTutorial|JScriptBasic|JScriptOperators下也可找到响应的优先级表。但是必要记着的最基础准绳是:乘、除法优先于加、减法。
3.办理和格局化字符串数据
从盘算意义上思索,具有盘算功效的任何布局或函数都可看做一种算法。比方,能够从数据库中取值组成一个字符串,代表主顾的名字。这里不触及怎样从数据库中提取数据(本书的前面部分举行会商)。上面程序的功效是字符串联接。
strTitle={getfromdatabase}
strFirstName={getfromdatabase}
strMiddleInitial={getfromdatabase}
strLastName={getfromdatabase}
strOther={getfromdatabase}
strPrint=strTitle&"."&strFristName&""&strMiddleInitial_
&"."&strstrLastName&""&strOther
运转这段程序能够失掉以下了局:
Ms.JanetC.ClarkeMBNA.BSc.MechEng.
但不是每一个人都和“Janet”一样,有一其中间名字。而且很多人大概没有头衔,以是大概仅仅失掉:
.Alex.Homer
这固然不是一个能引发剧本不克不及运转大概发生运转期毛病的致命毛病。但是,关于用户来讲,供应如许的剧本是不成承受的。最好程序能在输入字符串之前反省名字的每部分。
…
strPrint=""
IfLen(strTitle)ThenstrPrint=strPrint&strTitle&"."
IfLen(strFirstName)ThenstrPrint=strPrint&strFirstName&""
IfLen(strMiddleInitial)ThenstrPrint=strPrint&strMiddleInitial&"."
IfLen(strLastName)ThenstrPrint=strPrint&strLastName
IfLen(strOther)ThenstrPrint=strPrint&""&strOther
下面这段程序包管了空格和小数点仅加在名字中有值的中央。假如仅给strOther字符串赋值,而对其他都不赋值的话,将在入手下手处失掉一个空格。但是呈现这类情形的大概性十分小。假如有姓的话,经由过程仅增加“Other”部分能够避免这类毛病的产生。
…
strPrint=""
IfLen(strTitle)ThenstrPrint=strPrint&strTitle&"."
IfLen(strFirstName)ThenstrPrint=strPrint&strFirstName&""
IfLen(strMiddleInitial)ThenstrPrint=strPrint&strMiddleInitial&"."
IfLen(strLastName)Then
strPrint=strPrint&strLastName
IfLen(strOther)ThenstrPrint=strPrint&""&strOther
EndIf
最坏的情形是了局为一个空字符串,能够反省这类大概性并中断打印。
…
IfLen(strPrint)=0Then
Response.Clear
Response.End
EndIf
7.2.2剧本运转期毛病
利用一个不存在的函数,大概损坏了剧本言语利用的划定规矩,会呈现剧本运转期毛病。很多毛病是语法毛病(本章后面会商过的),可是很多毛病是因为所赋的值和函数参数的请求纷歧致引发的。比方,用一个窗体搜集来自用户的日期,并存进数据库中,大概用其他体例举行处置。为了断定日期是无效的,在把数据拔出数据库之前利用CDate函数:
<%
strDate=Request.Form("TheDate")
datDate=CDate(strDate)
…
假如用户在填表时呈现了不对,程序便会发生一个剧本毛病,如-12所示:
检察毛病信息,能够发明毛病是由实行程序代码的剧本引擎发生的。毛病号用十六进制显现出来,它是由VBScript毛病号和十六进制数0x800A0000相加失掉的(见第4章),上例中VBScript毛病号是十六进制0xD,大概十进制数的13。
年夜多半微软手艺(包含ASP)前往的毛病号是由8位十六进制数构成的。第一名字符老是8,标明这个形态信息是服务器毛病信息。前面随着2位0,然后是服务代码。对VBScript和JScript毛病,服务代码老是“A”,最初4位字符是用十六进制数暗示的毛病号。
假如检察一下VBScript文档,你会发明13号毛病是“TypeMismatch”毛病。固然,我们从ASP毛病页中显现的毛病形貌中已晓得了这一点。但是,在本章前面我们将要看到,在毛病处置手艺中,失掉毛病号长短常有效的。
注重,在毛病信息显现窗口中,显现的是服务器对毛病的反应信息。HTTP形态代码为500.100,属于“InternalServerError”。在第4章,会商ASP定制毛病网页的事情体例时,我们发明这类毛病经常由于载进了毛病网页。本章前面,将会看到在网页中怎样处置这些毛病。
7.2.3ASP和SSI的运转期毛病
剧本毛病是由正在利用的剧本引擎发明的,但是ASPDLL和SSIDLL也能发明剧本毛病,只管它们与利用的剧本引擎有关。典范的SSI例子是在#include指令中给文件一个毛病的名字或路径。毛病是由SSIDLL或ASP发明的,而不是由剧本引擎发明。可看到此时毛病范例是“ActiveServerPages”,ASP外部毛病代码是“ASP0126”,如-13所示,但是在这类情形下,毛病号是4005,指出了这是一种SSIDLL(ssinc.dll)界说的特别毛病。
ASP毛病代码总览
关于在ASPDLL中形成失利的毛病,表7-1是前往的毛病代码。当这类毛病产生时,你能够在ASPError工具的ASPCode属性中找到这些毛病代码。
表7-1ASP毛病代码
毛病代码
毛病动静和扩大信息
ASP0100
OutofMemory(内存溢出)
ASP0101
Unexpectederror(函数前往exception_name)
ASP0102
Expectingstringinput(等候字符串输出)
ASP0103
Expectingnumericinput(等候数字输出)
ASP0104
Operatingnotallowed(操纵不同意)
ASP0105
Indexoutofrange(数组下标溢出)
ASP0106
TypeMismatch(数据范例不婚配)
ASP0107
StackOverflow(处置的数据量凌驾了同意的局限)
ASP0115
Unexpectederror(呈现在内部工具中的可捕捉的毛病exception_name,剧本不克不及持续运转)
ASP0177
Server.CreateObjectFalied(有效的ProgID)
ASP0190
Unexpectederror(当开释内部工具时,呈现的可捕捉的毛病)
ASP0191
Unexpectederror(当内部工具的OnStartPage办法中呈现的可捕捉的毛病)
ASP0192
Unexpectederror(在内部工具的OnEndPage办法中呈现的可捕捉的毛病)
ASP0193
OnStartPageFailed(在内部工具OnStartPage办法中呈现毛病)
ASP0194
OnEndPageFailed(在内部工具的OnEndPage办法中呈现毛病)
ASP0240
ScriptEngineException(剧本引擎从object_name抛出非常exception_name)
ASP0241
CreateObjectException(object_name的CreateObject办法所招致的非常exception_name)
ASP0242
QueryOnStartPageInterfaceException(查询工具object_name的OnStartPage或OnEndPage办法所招致的非常exception_name)
ASP毛病一般仅当组件有成绩或服务器自己有成绩时才呈现。最多见是利用Server.CreateObject时的ASP0177毛病和严峻的ASP0115毛病。ASP0115毛病一般暗示组件程序代码中产生的毛病,而ASP0177毛病一般是由不克不及准确安装组件引发的大概由我们指定的ProgID字符串的毛病引发的。
7.2.4客户端剧本毛病
到今朝为止,我们已懂得了来自ASP的毛病。但是ASP也常常用于创立包括客户端剧本的网页。假如包括客户端代码的<SCRIPT>元素没有被设置成RUNAT="SERVER"属性,ASP将不思索服务器,而把网页信息不加改动地传送到客户端。
因而,假如翻开了一个ASP网页,而且显现的是一个扫瞄器毛病对话框,就不该该在服务器端寻觅ASP程序代码的毛病。扫瞄器看不到ASP程序代码,以是不克不及辨认任何毛病,假如有一个对话框呈现在客户端,那末在客户端代码中一定有一个毛病。
1.语法毛病
假如在网页中的客户端程序代码有语法毛病的话,当剧本下载到客户端,扫瞄器便会呈现响应的毛病。只管网页中内容仍可一般载进(除非由这些客户端剧本代码静态装进),但网页中断实行。用户将看到一个包括毛病细节的对话框,大概是一个唆使网页包括毛病的形态条动静。
古代扫瞄器趋势于埋没网页剧本毛病的细节,而仅在形态条上显现一个小的毛病图标。在IE4.0和IE5.0中,一般的毛病对话框能够经由过程InternetOptions对话框的Advanced页举行设置来激活,如-14所示:
处置剧本程序代码中的客户端毛病和在服务器端类似,而且一般会更简单些,由于常常能够间接从服务器目次中经由过程双击来下载网页。一样平常不必要经由过程Web服务器和HTTP取得网页来察看扫瞄器中的了局,个中的独一分歧是一些服务器交互由客户端剧本来完成,如利用RDS的数据绑定大概静态装进。
2.运转期或语义毛病
在客户端剧本中,一般大概会碰到语法毛病,也会常常碰到运转期或语义毛病。现实上,在客户端,这类征象是很广泛的。由于在客户端不克不及像服务器端那样对剧本的情况举行把持,不克不及一定用户在他们的呆板上正运转甚么,实践上在服务器上仅能从一些组件如BrowserCapabilities中失掉也许情形。
以是,利用客户端工具或特别版本的剧本言语和属性的剧本程序极可能不克不及一般事情。只管云云,处置客户端毛病和处置服务器端毛病是差未几的。
3.在服务器上创立的客户端程序代码
在毛病产生时,作为“客户端对话框对应于ASP毛病页面”划定规矩(关于堕落的中央)的一个出格的破例是,利用ASP程序代码在服务器上静态地创立客户端程序代码。比方,大概想在ASP中举行求值运算,然后把数据传给运转在客户真个剧本代码,大概最简单的办法是把数据作为一个变量拔出剧本代码中:
<%
getthenameofourserverfromtheServerVariablescollection
strServerNameInASP=Request.ServerVariables("SERVER_NAME")
%>
<SCRIPTLANGUAGE="JScript"RUNAT="CLIENT">
<!--hidecodefromolderbrowsers
varstrServerName="<%=strServerNameInASP%>";
…
alert(Servernameis:+strServerName);
…
//stophidingcode
-->
</SCRIPT>
在客户端,在ASP处置这个页面以后,将失掉的是:
<SCRIPTLANGUAGE="JScript"RUNAT="CLIENT">
<!--hidecodefromolderbrowsers
varstrServerName="WROXBOX";
…
alert(Servernameis:+strServerName);
…
//stophidingcode
-->
</SCRIPT>
能够疏忽RUNAT="CLIENT"属性,可是加上这一项可使得在检察运转代码的ASP网页时加倍分明。
如许,假如在某个地位想把服务器端数据库中的数据到场到一个客户端数组中,能够接纳上面的程序完成:
<SCRIPTLANGUAGE="JScript"RUNAT="CLIENT">
<!--hidecodefromolderbrowsers
vararrBooks=newArray(10)//highestavailableindexwillbe
<%startofASPprocessing
intIndex=0
DoWhile{notattheendofsomerecordset}
strTitle={gettitlefromdatabaserecord}
Response.Write"arrBooks["&CInt(intIndex)&"]="_
&strTitle&";"&vbCrlf
intIndex=intIndex+1
{movetonextrecordindatabase}
Loop
…
dosomethinghereontheclientwiththearrayofbooktitles
…
//stophidingcode
-->
</SCRIPT>
这段服务器端ASP程序代码发生的客户端代码,在客户端运转时创立书名题目数组。同时发生的客户端剧本毛病呈现在扫瞄器的毛病对话框中。毛病的缘故原由是以arrBooks定名的数组是由JavaScript代码运转在客户端时创立的,仅能承受9个书名;而服务器端代码能极可能发生多于9个的书名,详细几由源数据库中的纪录数来决意。这相称于以下客户端代码:
<SCRIPTLANGUAGE="JScript"RUNAT="CLIENT">
<!--hidecodefromolderbrowsers
vararrBooks=newArray(10)//highestavailableindexwillbe
arrBooks[0]=InstantJavaScript;
arrBooks[1]=ProfessionalASP3.0Programming;
arrBooks[2]=ADO2.5ProgrammersReference;
…
etc
…
arrBooks[9]=ASPTechniquesforWebmasters;
arrBooks[10]=ASPProgrammersReference;//<-client-sideerroroccurshere
arrBooks[11]=ADSICDOProgramming;
arrBooks[12]=ProfessionalMTSandMSMQProgramming;
…
dosomethinghereontheclientwiththearrayofbooktitles
…
//stophidingcode
-->
</SCRIPT>
这个页面只要经由修改以后才干一般事情,能够经由过程增添数组巨细,也能够经由过程把持来自数据库的纪录数使其一般事情。
想法是和程序员的想法不一样的.至于为什么.大家去想一想.跟心理学有关的 |
|