|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
当然了,现在国内CRM厂商的产品与其说是CRM,但从至少从我的角度分析上来看,充其量只是一个大型的进销存而已了,了解尚浅,不够胆详评,这里只提技术问题毛病
即便接纳了进攻性编程手艺以后,毛病仍能进进到网页,这多是由于测试其实不充实,大概是由于所依托的一些其他资本或服务没有准确事情。为了避免页面呈现成绩,在程序中要可以举行定制毛病处置。
7.4.1ASP缺省毛病处置器
后面已看到过,ASP和IIS能找出网页中的年夜多半毛病,而且能主动天生毛病信息页,这些毛病几近老是500.100范例的,而且IIS用Server.Transfer办法装载以500-100.asp定名的缺省毛病页,然后传送给客户。第4章先容了这一事情历程,和怎样与定制毛病网页接口。
但是,运转期剧本毛病不老是由IIS发明的,当一个运转期毛病产生时,剧本引擎会检察一下今朝实行点或语句的情况。假如正在实行一个子程序或函数,缺省的剧本引擎毛病处置器经由过程停止子程序的运转并前往挪用子程序的中央来指堕落误。
在这里,程序会检察是不是完成了其他的毛病处置器,假如没有的话,又会反复这个历程,然后前往到挪用子程序的中央。当子程序前往到网页的主程序(在任何其他子程序或函数表面)时,程序又检察是不是完成了任何其他的毛病处置器。在这个过程当中,只要的确没有发明其他的毛病处置器,程序才给ASP提醒毛病,唆使IIS把实行转到缺省的毛病页面。
7.4.2VBScript毛病处置
在VBScript中,可使剧本注释器不处置其找到的任何毛病,而且利用OnErrorResumeNext语句持续运转下个语句。一旦这个语句已被处置,剧本引擎将持续运转前面的程序,而不睬会已发明的任何毛病。但是,这类历程仅合用于按次实行语句的情况,换句话说,不合用于嵌套的函数或子程序。
1.利用OnErrorResumeNext语句
一个毛病在子程序中呈现时,假如没有运转OnErrorResumeNext语句,那末毛病将被交给挪用它的情况,这个历程一向反复到找到运转OnErrorResumeNext语句的情况持续运转,大概找到缺省的剧本毛病处置器,把毛病交给ASP而且IIS显现缺省毛病网页。这个历程如-16所示:
这类毛病挪用链意味着能够创立避免使程序中断运转的运转期毛病的函数和子程序。假如在子程序的开首安排一个OnErrorResumeNext语句,任何运转期毛病会中断这个子程序的运转,可是挪用该子程序的程序将持续运转而不会引发网页的中断。
比方,假如必要向一个文件中写进字符串,能够经由过程一个自力的函数对文件举行会见文件,避免毛病中止全部程序的运转:
createafilenamedstrFileName,overwritinganyexistingonewiththatname
andwritesstrContentintoitthenclosesthefile
returnsTrueifitsucceeds,orFalseonanyerror
FunctionWriteNewFile(strFileName,strContent)
OnErrorResumeNextturnoffthedefaulterrorhandler
WiteNewFile=Flasedefaultreturnvalueoffunction
SetobjFSO=CreateObject("Scripting.FileSystemObject")
IfErr.Number=0ThenSetobjFile=objFSO.CreateTextFile(strFileName,True)
IfErr.Number=0ThenobjFile.WriteLinestrContent
IfErr.Number=0ThenobjFile.Close
IfErr.Number=0ThenWriteNewFile=True
EndFunction
注重下面的程序在试图处置每一个程序语句之前,先反省VBScript的Err工具的Number属性。假如这个值为0(还没有呈现毛病),那末就可以够持续对文件的定进和创立历程。但是假如毛病的确产生了,剧本引擎将设置Err工具的属性的值,而且持续处置下一行。
只需不引发毛病而能一般运转,函数的前往值将设置为“True”。不然函数将前往“False”。在编程中能够在对其举行测试今后,再利用该函数和接纳其他举动。
上面是一个复杂的例子,我们但愿对义务的第一部分接纳一个自力的函数,以便能更准确地分辨堕落误发生在那边。如许,调试时也更简单浏览代码。在页面的主程序中,能够挪用三个独自的函数。
IfCreateNewFile(strFileName)Thencreatethenewfile
Response.Write"Newfilesuccessfullycreated<BR>"
IfWriteContent(strContent)Thenwritethecontent
Response.Write"Contentwrittentofile<BR>"
Else
Response.Write"ERROR:Failedtowritetothefile<BR>"
EndIf
IfCloseFile(strFileName)Then
Response.Write"Fileclosed<BR>"
Else
Response.Write"ERROR:Failedtoclosethefile<BR>"
EndIf
Else
Response.Write"ERROR:Failedtocreatethenewfile<BR>"
EndFunciotn
2.利用OnErrorGoto0
在ASP2.0(只管没有文档纪录)和ASP3.0中,也能利用OnErrorGoto0语句恢复缺省的毛病处置举动。在运转这个语句后,产生的运转期毛病将招致缺省毛病处置,在情况链中反省每一个嵌套的程序,直到主页面代码。假如没有其他的情况封闭缺省毛病处置,网页的实行将中断并显现IIS缺省毛病网页。
3.VBScriptErr工具
在后面的例子中,封闭缺省毛病处置时,经由过程反省VBScriptErr工具的Number属性,检察毛病是不是已呈现。Err工具存储了关于运转期毛病的信息,表7-3和表7-4给出了VBScriptErr工具供应的办法和属性。
表7-3VBScriptErr工具的办法
方法
说明
Clear
扫除以后一切的Err工具设置
Raise
发生一个运转期毛病
表7-4VBScriptErr工具的属性
属性
说明
Description
设置或前往一个形貌毛病的字符串
Number
(缺省)设置或前往指定一个毛病的值
Source
设置或前往发生毛病的工具的称号
利用这些属性能够反省产生了哪一种毛病。比方,能够依据毛病号接纳分歧的措施,也能够用Source和Description的属性值为用户供应毛病信息,大概传送到一个文件中。
也能够利用Err工具天生一个毛病。为何要做这些呢?由于偶然想把一个定制的毛病动静传送给用户。能够把Err工具的属性设置成所但愿的任何值。然后挪用Raise办法来发生这类毛病,如许做会中断程序的运转,而且把毛病沿挪用链向回传送。
上面的例子显现了在服务器磁盘上读取一个文本文件时,怎样处置毛病。注重怎样利用常数vbObjectError,以断定所选择的毛病号不会和一个已存在的毛病号搅浑。经由过程把恣意选择的毛病号加到此常数中,就可以够包管和预界说的毛病不搅浑。
FunctoinReadThisFile(strFileName)returnsthecontentasastring
OnErrorResumeNext
ReadThisFile=""defaultreturnvalueoffunction
SetobjFSO=CreateObject("Scripting.FileSystemObject")
SetobjFile=objFSO.OpenTextFile("strFileName",ForReading)
SelectCaseErr.Number
Case0OK,takenoaction
Case50,53standardfileorpathnotfounderrors
createcustomerrorvaluesandraiseerrorbackupthecallchain
intErrNumber=vbObjectError+1073customerrornumber
strErrDescription="Thefilehasbeendeletedormoved."
strErrSource="ReadThisFilefunction"
Err.RaiseintErrNumber,strErrSource,strErrDescription
ExitFunction
CaseElsesomothererror
raisethestandarderrorbackupthecallchain
Err.RaiseErr.Number,Err.Source,Err.Description
ExitFunction
EndSelect
ReadThisFile=objFile.ReadAllweopeneditOK,soreturnthecontent
objFile.Close
EndFunction
挪用这个函数的代码可使用OnErrorResumeNext语句,而且能捕捉这个函数发生的毛病。
OnErrorResumeNext
strContent=ReadThisFile("myfile,txt")
IfErr.Number=0Then
Response.Write"Filecontentis:<BR>"&strContent
Else
Response.Write"Err.Source&"<BR>"&Err.Description
EndIf
7.4.3JScript毛病处置
在5.0版之前,JScript的毛病处置处置才能其实不杰出,但是在5.0版中情形改动了,JScript接纳了一套和Java和C++十分相似的毛病处置体系。它把握起来只管不像VBScript手艺那样简单,但人们以为在毛病处置上,JScript走在前头。
在第1章中,在会商这两个次要剧本言语的新特性时分,已具体会商了JScript毛病处置,这里不再反复。假如浏览第1章时跳过了这部分,能够回到那边看看。
7.4.4利用IIS毛病页面
与ASP毛病处置历程相干的内容是为IIS供应可定制的毛病页面。现实上,在IIS4.0中也有这个特性。但新的ASP内置工具ASPError,更容易于利用且供应加倍壮大的功效。
在第4章,当我们研讨Server.Execute和Server.Transfer办法时,已报告了怎样创建定制的毛病页面。我们也会商和利用了ASPError工具,但这类体例遭到了必定的限定。在这一部分,将先容怎样将定制的毛病网页和ASPError工具分离起来创建一个更好的处置ASP毛病的办法。
我们可使用VBScript反省ASPError工具的内容,从而创立一个定制的毛病页面。构建一个包括毛病内容周全信息的字符串,且写进到服务器磁盘上的日记文件中。但是网页的计划仅使会见者看到网页不成用如许一条信息是不可的,应当使会见者可以选择是从头载进上一个网页仍是回到主页,使他们没认识已产生了毛病。
只管我们接纳VBScript创立这个网页,但其利用的一些特征对JScript来讲也是合用的,这两种剧本言语的互相转换也是对照简单的。
能够从http://www.wrox.com站点下载本章及本书其他章节的示例文件。
1.设置定制的毛病页面
在能利用定制的毛病页面之前,必需在InternetServicesManager举行响应的设置(设置体例见第4章)。把示例文件装进盘算机的wwwroot目次中,翻开Chapter07子目次的Properties对话框,在CustomErrors选项卡中,转动列表并选中HTTP毛病“500:100”条目,点击EditProperties按钮,并键进定制的毛病页面Custom_error.asp的URL,如-17所示:
如今Chapter07子目次中的页面呈现一个ASP毛病时,就会翻开定制的毛病页面。
2.利用定制的毛病页面
在扫瞄器中翻开Chapter07目次并选择到“UsingaCustomErrorPage”的链接,这个页面显现了一系列用于发生各类范例的毛病的按钮,点击标有“LoadaPagewithaSyntaxerror”的按钮,如-18所示:
这将载进一个名为syntax_error.asp的复杂页面。但是看不到这个页面,由于这个页面包括了一个语法毛病。ASP停止这个页面的编译/实行,并把实行转到定制毛病页面,这个页面展现了毛病的细节和两个按钮,这两个按钮用以前往上个页面(主菜单)或前往Web站点的缺省主页,如-19所示:
这个页面也把毛病呈报追加到服务器磁盘C:temp文件夹中名为custom_error.log的日记文件中,能够在文件编纂器中翻开并检察它,-20所示的日记文件已纪录了几个毛病。
假如在页面中失掉了一个信息,指嫡志文件不克不及写进信息,多是由于IUSR_machinename(IUSR_盘算机名)帐号没有会见C:temp目次的权限。当测试这个页面时,应当赐与IUSR_machinename帐号对这个目次的全体把持权,大概改动custom_error.asp页面的程序代码以指向一个IUSR有全体把持权的文件夹
毛病动静呈现在页面中的独一缘故原由,是由于在cause_error.asp页面中我们选择了响应的复选框。假如封闭该选项并再次点击按钮,便看不到毛病的具体情形,但是毛病信息仍旧纪录在服务器磁盘上的custom_error.log毛病日记文件中。
“Displaydebugginginformation”复选框给定制毛病页面(而不是日记文件)供应了更多的信息,有助于调试那些利用ASP内置工具汇合值的页面,如-21所示:
在本章上面部分,将再会商这一成绩,同时也能够懂得“CauseAnError”页面上的其他按钮所供应的其他品种的毛病信息。注重有一些按钮可以比其他的按钮可以供应更多信息。出格是只要最初一个按钮给出ASP毛病代码的值(这里是ASP0177)。
(1)“CauseAnError”页面的功效
与先前会商的示例页面一样,引发毛病的页面利用一样的手艺,用<Form>把值提交给统一个页面。然后ASP程序检察窗口上点击的是谁人SUBMIT按钮,然后运转代码的响应部分。同时检察是不是页面上两个复选框是不是选中,假如是如许,程序起首设置一个或两个会话级的变量以指明这一点。
<%
seeifwearedisplayingerroranddebuginformation
setsessionvariablestoretrieveinthecustomerrorpage
IfLen(Request.Form("chkShowError"))Then
Session("ShowError")="Yes"
Else
Session("ShowError")=""
EndIf
IfLen(Request.Form("chkShowDebug"))Then
Session("ShowDebug")="Yes"
Else
Session("ShowDebug")=""
EndIf
...
%>
因为利用了Server.Transfer,当毛病产生时,正在运转的网页的全部ASP情况由IIS传给定制毛病页面。但是,剧本变量的值并没有传给定制毛病页面,以是必需利用Session变量,大概把值增加到Request.Form或Request.QueryString汇合以便把值传送给定制毛病页面。
设置了Session变量以后,程序持续检察点击了哪一个按钮。每一个范例的毛病(除第一范例外),都是由运转响应的ASP代码发生的,第一范例的毛病必要挪用另外一个页面。
...
lookforacommandsentfromtheFORMsectionbuttons
IfLen(Request.Form("cmdSyntax"))Then
Response.Clear
Response.Redirect"syntax_error.asp"
EndIf
IfLen(Request.Form("cmdParamType"))Then
intDate="error"
intDay=Day(intDate)
EndIf
IfLen(Request.Form("cmdArray"))Then
DimarrThis(3)
arrThis(4)="Causesanerror"
EndIf
IfLen(Request.Form("cmdFile"))Then
SetobjFSO=Server.CreateObject("Scripting.FileSystemObject")
SetobjTStream=objFSO.OpenTextFile("does_not_exist.txt")
EndIf
IfLen(Request.Form("cmdPageCount"))Then
SetobjPageCount=Server.CreateObject("MSWC.PageCounter")
objPageCount.WrongProperty=10
EndIf
IfLen(Request.Form("cmdObject"))Then
SetobjThis=Server.CreateObject("Doesnot.Exist")
EndIf
%>
(2)定制毛病页面的事情
晓得了怎样创立毛病后,让我们来看看定制的毛病页面。在后面的章节里已晓得了构建网页必要的实际,这里再提要地形貌一下其事情历程。第一步是封闭缺省的毛病处置器以便页面程序不被另外一个毛病中止。第二步经由过程创立一个新的ASPError工具搜集原始毛病信息。举行这个事情时要格局化一些值,并把它们转换成符合的数据范例。
<%
preventanyothererrorsfromstoppingexecution
OnErrorResumeNext
getareferencetotheASPErrorobject
SetobjASPError=Server.GetLastError()
getthepropertyvalues
strErrNumber=CStr(objASPError.Number)normalerrorcode
strASPCode=objASPError.ASPCodeASPerrorcode(ifavailable)
IfLen(strASPCode)Then
strASPCode=""&strASPCode&""
Else
strASPCode=""
EndIf
strErrDescription=objASPError.Description
strASPDescription=objASPError.ASPDescription
strCategory=objASPError.Categorytypeorsourceoferror
strFileName=objASPError.Filefilepathandname
strLineNum=objASPError.Linelinenumberinfile
strColNum=objASPError.Columncolumnnumberinline
IfIsNumeric(strColNum)Thenifavailableconverttointeger
lngColNum=CLng(strColNum)
Else
lngColNum=0
EndIf
strSourceCode=objASPError.Sourcesourcecodeofline
...
如今构建一个毛病呈报字符串,这段程序看起来庞大,但实践上仅是一系列If...Then语句的嵌套,用以发生优秀的呈报格局,没有任何空的段落。假如毛病是语法毛病,来自ASPError工具的Source属性的源代码可在strSourceCode变量中失掉,可使用这个变量及lngColNum的值(从ASPError工具的Column属性中失掉)增添一个标志用来指明在源程序中的甚么中央发明了毛病。
...
createtheerrormessagestring
strDetail="ASPError"&strASPCode&"occurred"&Now
IfLen(strCategory)Then
strDetail=strDetail&"in"&strCategory
EndIf
strDetail=strDetail&vbCrlf&"Errornumber:"&strErrNumber_
&"(0x"&Hex(strErrNumber)&")"&vbCrlf
IfLen(strFileName)Then
strDetail=strDetail&"File:"&strFileName
IfstrLineNum>"0"Then
strDetail=strDetail&",line"&strLineNum
IflngColNum>0Then
strDetail=strDetail&",column"&lngColNum
IfLen(strSourceCode)Then
getthesourcelinesoputa^markerinthestring
strDetail=strDetail&vbCrlf&strSourceCode&vbCrlf_
&String(lngColNum-1,"-")&"^"
EndIf
EndIf
EndIf
strDetail=strDetail&vbCrlf
EndIf
strDetail=strDetail&strErrDescription&vbCrlf
IfLen(strASPDescription)Then
strDetail=strDetail&"ASPreports:"&strASPDescription&vbCrlf
EndIf
...
(3)纪录毛病
用名为strDetail的字符串变量创立了毛病呈报后,能够像在第5章中做的那样,接纳FileSystemObject工具把它追加到日记文件中。假如乐成,布尔型“failedflag”变量将被设置成False。
...
nowlogerrortoafile.Editthepathtosuityourmachine.
youneedtogivetheIUSR_machinenamepermissiontowriteandmodify
thefileordirectoryusedforthelogfile:
strErrorLog="c:tempcustom_error.log"
SetobjFSO=Server.CreateObject("Scripting.FileSystemObject")
SetobjTStream=objFSO.OpenTextFile(strErrorLog,8,True)8=ForAppending
IfErr.Number=0ThenobjTStream.WriteLinestrDetail&vbCrlf
IfErr.Number=0Then
objTStream.Close
blnFailedToLog=False
Else
blnFailedToLog=True
EndIf
%>
(4)跳转到另外一个页面
如今筹办在网页中创立一些输入。在此之前,必要反省毛病细节以断定下一步要做甚么。比方,可用ASPError工具的Number或其他属性反省毛病范例。在这里,可以为“TypeMismatch”毛病不是代码中有毛病,多是因为用户在文本框中输出毛病数据发生的。以是不显现这个网页的残剩部分,而是跳转到另外一个网页
IfobjASPError.Number=-2146828275Then0x800A000D-typemismatch
Response.Clear
Response.Redirect"/"gototheHomepage
EndIf
是不是决意如许做依附于你本人的情形和你盘算发明、纪录或显现的毛病范例。必要注重的是,由于我们不想把今朝的网页情况传送到新的网页上,以是选择利用Reponse.Redirect语句而不是用Server.Transfer语句。
(5)显现毛病信息
最初,显现毛病呈报和其他信息和前往到上一个网页或主页的按钮。
<%
seeiftheloggingtofilefailed
ifso,displaymessage
IfblnFailedToLogThen
Response.Write"<B>WARNING:Cannotlogerrortofile"&strErrorLog&"</B>.<P>"
EndIf
seeifwearedisplayingtheerrorinformation
IfSession("ShowError")="Yes"Then
%>
<PRE><%=Server.HTMLEncode(strDetail)%></PRE>
<%
EndIf
seeifwearedisplayingthedebuginformation
IfSession("ShowDebug")="Yes"ThenServer.Transfer"debug_request.asp"
createthebuttonstoreturntothepreviousorHomepage
strReferrer=Request.ServerVariables("HTTP_REFERER")
IfLen(strReferrer)Then
%>
<FORMACTION="<%=strReferrer%>">
<INPUTTYPE="SUBMIT"NAME="cmdOK"VALUE="">
Returntothepreviouspage<P>
</FORM>
<%
EndIf
%>
<FORMACTION="/">
<INPUTTYPE="SUBMIT"NAME="cmdOK"VALUE="">
GotoourHomepage<P>
</FORM>
对下面这段程序必要注重的是:在定制毛病页面里,不克不及利用Server.Execute办法。假如我们如许做的话,最少程序不克不及一般事情。当程序把实行转到特定的网页时,程序不会再前往到以后网页,这就是我们利用Server.Transfer办法载进显现调试信息的网页的缘故原由。这是下一部分要会商的成绩。
ASP.NET和ASP的比较,技术上比较已经没什么可说的了.新一代在大部分程度来说当然是比旧一代好了.关键看你对所做软件的理解了.因人而定.会写的话也可能比ASP.NET写得更有效率和更方便重用 |
|