ASP Error對(duì)象的技巧_ASP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:ASP開發(fā)中有用的函數(shù)(function)集合(1)
      ASP開發(fā)中有用的function集合,挺有用處的!希望大家保留! % '************************************* '防止外部提交 '************************************* function ChkPost() dim server_v1,server_v2 chkpost=false server_v1=Cstr(Request.ServerVari

      在VBScript中,有一個(gè)On Error Resume Next語句,它使腳本解釋器忽略運(yùn)行期錯(cuò)誤并繼續(xù)腳本代碼的執(zhí)行。接著該腳本可以檢查Err.Number屬性的值,判別是否出現(xiàn)了錯(cuò)誤。如果出現(xiàn)錯(cuò)誤,返回一個(gè)非零值。在ASP 3.0中,也可以使用On Error Goto 0“轉(zhuǎn)回到”缺省的錯(cuò)誤處理。在ASP 2.0中實(shí)際也進(jìn)行這種處理,但是沒有相應(yīng)文檔說明,這在很多asp數(shù)據(jù)相關(guān)處理文件中司空見慣,加上On Error Resume Next ,關(guān)閉缺省的錯(cuò)誤處理,然后用err抓住,
      If Err Then
      err.Clear
      Response.Write "出現(xiàn)了錯(cuò)誤!"
      Response.End
      End If

      為了得到更加詳細(xì)的錯(cuò)誤說明,我們就試試asperror對(duì)象吧,它是asp3.0的新對(duì)象,它可以通過server對(duì)象的getlasterror方法得到,asperror提供了關(guān)于asp中發(fā)生最后一個(gè)錯(cuò)誤的詳細(xì)信息,與VBScript的Err對(duì)象不同,不能為查看是否出現(xiàn)了錯(cuò)誤而隨時(shí)調(diào)用該方法,只能在一個(gè)ASP定制的錯(cuò)誤網(wǎng)頁中使用。如果像對(duì)Err對(duì)象進(jìn)行操作那樣,通過關(guān)閉缺省的錯(cuò)誤處理(用On Error Resume Next語句)來使用,則GetLastError方法不能訪問錯(cuò)誤的詳細(xì)數(shù)據(jù)。
      ASPError對(duì)象的屬性:
      ASPError對(duì)象提供了九個(gè)屬性說明所出現(xiàn)的錯(cuò)誤的性質(zhì)和錯(cuò)誤源,并返回引發(fā)錯(cuò)誤的實(shí)際代碼,其屬性及說明如下:

      ASPCode : 整型。由ASP/IIS產(chǎn)生的錯(cuò)誤號(hào),例如0x800A009
      ASPDescription: 字符串型。如果這個(gè)錯(cuò)誤是與ASP相關(guān)的錯(cuò)誤,這個(gè)屬性是錯(cuò)誤的詳細(xì)說明.例如:All HTTP: HTTP_ACCEPT:*/* HTTP_ACCEPT_LANGUAGE:zh-cn HTTP_CONNECTION:Keep-Alive HTTP_HOST:s HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; (R1 1.5)) ...還有cookie等報(bào)告.
      Category : 字符串型。錯(cuò)誤來源,即ASP內(nèi)部腳本語言、或一個(gè)對(duì)象.
      Column : 整型。產(chǎn)生錯(cuò)誤的文件中的字符位置
      Description : 字符串型。錯(cuò)誤的簡(jiǎn)短說明
      File : 字符串型。錯(cuò)誤出現(xiàn)時(shí)正在處理的文件的名稱
      Line : 整型。產(chǎn)生錯(cuò)誤的文件中的行號(hào)
      Number : 整型。一個(gè)標(biāo)準(zhǔn)的COM錯(cuò)誤代碼
      Source : 字符串型。引發(fā)錯(cuò)誤的行的實(shí)際代碼

      ok,這就是9個(gè)屬性,使用asperror對(duì)象的語法是:
      asperror.property
      就是這樣:ASPError.ASPCode()
      ASPError.ASPDescription()
      ASPError.Category()
      ASPError.Column()
      ASPError.Description()
      ASPError.File()
      ASPError.Line()
      ASPError.Number()
      ASPError.Source()

      在iis支持的所有目錄下面(或:在編輯了錯(cuò)誤映射屬性的目錄內(nèi))的任一頁面上出現(xiàn)一個(gè)與ASP相關(guān)的錯(cuò)誤時(shí),都將載入定制錯(cuò)誤頁面。實(shí)際上,現(xiàn)在已經(jīng)設(shè)置了一個(gè)正常的腳本錯(cuò)誤陷阱,因?yàn)樵谶@個(gè)目錄內(nèi)的任何一個(gè)網(wǎng)頁上的ASP運(yùn)行期錯(cuò)誤都將觸發(fā)定制錯(cuò)誤頁面,錯(cuò)誤網(wǎng)頁作為IIS的缺省安裝部分,可根據(jù)個(gè)人情況定制.例如,當(dāng)我們?cè)谝粋(gè)目錄下面輸入不存在的網(wǎng)頁時(shí),出現(xiàn)404錯(cuò)誤,當(dāng)一個(gè)404錯(cuò)誤出現(xiàn)時(shí),使用的頁面是404b.htm,這個(gè)文件包含一個(gè)客戶端腳本代碼部分,它獲得當(dāng)前文檔的URL(從document對(duì)象的url屬性中檢索)并在該頁面中顯示:[html]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
      <html dir=ltr>

      <head>
      <style> a:link {font:9pt/11pt 宋體; color:FF0000} a:visited {font:9pt/11pt 宋體; color:#4e4e4e}
      </style>

      <META NAME="ROBOTS" CONTENT="NOINDEX">

      <title>無法找到網(wǎng)頁</title>

      <META HTTP-EQUIV="Content-Type" Content="text-html; charset=gb2312">
      <META NAME="MS.LOCALE" CONTENT="ZH-CN">
      </head>

      <script>
      function Homepage(){
      <!--
      // in real bits, urls get returned to our script like this:
      // res://shdocvw.dll/http_404.htm#http://www.DocURL.com/bar.htm

      //For testing use DocURL = "res://shdocvw.dll/http_404.htm#https://www.microsoft.com/bar.htm"
      DocURL = document.URL;

      //this is where the http or https will be, as found by searching for :// but skipping the res://
      protocolIndex=DocURL.indexOf("://",4);

      //this finds the ending slash for the domain server
      serverIndex=DocURL.indexOf("/",protocolIndex + 3);

      //for the href, we need a valid URL to the domain. We search for the # symbol to find the begining
      //of the true URL, and add 1 to skip it - this is the BeginURL value. We use serverIndex as the end marker.
      //urlresult=DocURL.substring(protocolIndex - 4,serverIndex);
      BeginURL=DocURL.indexOf("#",1) + 1;

      urlresult=DocURL.substring(BeginURL,serverIndex);

      //for display, we need to skip after http://, and go to the next slash
      displayresult=DocURL.substring(protocolIndex + 3 ,serverIndex);

      InsertElementAnchor(urlresult, displayresult);
      }

      function HtmlEncode(text)
      {
      return text.replace(/&/g, '&amp').replace(/'/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
      }

      function TagAttrib(name, value)
      {
      return ' '+name+'="'+HtmlEncode(value)+'"';
      }

      function PrintTag(tagName, needCloseTag, attrib, inner){
      document.write( '<' + tagName + attrib + '>' + HtmlEncode(inner) );
      if (needCloseTag) document.write( '</' + tagName +'>' );
      }

      function URI(href)
      {
      IEVer = window.navigator.appVersion;
      IEVer = IEVer.substr( IEVer.indexOf('MSIE') + 5, 3 );

      return (IEVer.charAt(1)=='.' && IEVer >= '5.5') ?
      encodeURI(href) :
      escape(href).replace(/%3A/g, ':').replace(/%3B/g, ';');
      }

      function InsertElementAnchor(href, text)
      {
      PrintTag('A', true, TagAttrib('HREF', URI(href)), text);
      }

      //-->
      </script>

      <body bgcolor="FFFFFF">

      <table width="410" cellpadding="3" cellspacing="5">

      <tr>
      <td align="left" valign="middle" width="360">
      <h1 style="COLOR:000000; FONT: 12pt/15pt 宋體"><!--Problem-->無法找到網(wǎng)頁</h1>
      </td>
      </tr>

      <tr>
      <td width="400" colspan="2"> <font style="COLOR:000000; FONT: 9pt/11pt 宋體">您正在搜索的網(wǎng)頁可能已經(jīng)刪除、更名或暫時(shí)不可用。</font></td>
      </tr>

      <tr>
      <td width="400" colspan="2"> <font style="COLOR:000000; FONT: 9pt/11pt 宋體">

      <hr color="#C0C0C0" noshade>

      <p>請(qǐng)嘗試下列操作:</p>

      <ul>
      <li>如果您在“地址”欄中鍵入了網(wǎng)頁地址,請(qǐng)檢查其拼寫是否正確。<br>
      </li>

      <li>打開 <script>
      <!--
      if (!((window.navigator.userAgent.indexOf("MSIE") > 0) && (window.navigator.appVersion.charAt(0) == "2")))
      {
      Homepage();
      }
      //-->
      </script> 主頁,尋找指向所需信息的鏈接。</li>

      <li>單擊<a href="javascript:history.back(1)">后退</a>按鈕嘗試其他鏈接。</li>
      </ul>

      <h2 style="font:9pt/11pt 宋體; color:000000">HTTP 404 - 無法找到文件<br> Internet 信息服務(wù)<BR></h2>

      <hr color="#C0C0C0" noshade>

      <p>技術(shù)信息(支持個(gè)人)</p>

      <ul>
      <li>詳細(xì)信息:<br><a href="http://www.microsoft.com/ContentRedirect.asp?prd=iis&sbp=&pver=5.0&pid=&ID=404&cat=web&os=&over=&hrd=&Opt1=&Opt2=&Opt3=" target="_blank">Microsoft 支持</a>
      </li>
      </ul>

      </font></td>
      </tr>

      </table>
      </body>
      </html>
      [/html]

      當(dāng)出現(xiàn)錯(cuò)誤時(shí),錯(cuò)誤和錯(cuò)誤網(wǎng)頁文件之間的映射關(guān)系是在每個(gè)目錄的properties對(duì)話框的Custom Errors選項(xiàng)卡中決定的,這在Internet Services Manager里面的屬性設(shè)置,誰有興趣的話就去看看.
      定制錯(cuò)誤網(wǎng)頁顯示ASPError對(duì)象屬性的所有值,并通過使用Response.Status方法,把一個(gè)HTTP報(bào)頭狀態(tài)消息返回給客戶端,指明出現(xiàn)了一個(gè)錯(cuò)誤。接著使用GetLastError方法獲取對(duì)ASPError對(duì)象的一個(gè)引用,因此可以訪問錯(cuò)誤的詳細(xì)數(shù)據(jù):

      <%
      Response.Status = "500 Internal Server Error"
      Set objASPError = Server.GetLastError()
      %>
      Currently executing the page: <B>show_error.asp</B><P>
      <B>Error Details:</B><BR>

      ASPError.ASPCode = <% = objASPError.ASPCode %><BR>
      ASPError.Number = <% = objASPError.Number %> (0x<% = Hex(objASPError.Number) %>)<BR>
      ASPError.Source = <% = Server.HTMLEncode(objASPError.Source) %><BR>
      ASPError.Category = <% = objASPError.Category %><BR>
      ASPError.File = <% = objASPError.File %><BR>
      ASPError.Line = <% = objASPError.Line %><BR>
      ASPError.Column = <% = objASPError.Column %><BR>
      ASPError.Description = <% = objASPError.Description %><BR>
      ASPError.ASPDescription = <% = objASPError.ASPDescription %>

      <FORM ACTION="<% = Request.ServerVariables("HTTP_REFERER") %>" METHOD="POST">
      <INPUT TYPE="SUBMIT" NAME="cmdOK" VALUE=" Return to the previous page ">
      <P>
      </FORM>
      如果一個(gè)腳本或ASP錯(cuò)誤出現(xiàn)在定制錯(cuò)誤網(wǎng)頁中,IIS將僅僅返回一個(gè)與錯(cuò)誤代碼500:100對(duì)應(yīng)的一般性消息。這可能是腳本引擎自己的錯(cuò)誤消息,或者只是相當(dāng)簡(jiǎn)單的消息:“Internal Server Error”。不會(huì)再次重新載入定制的錯(cuò)誤網(wǎng)頁。
      包含錯(cuò)誤的網(wǎng)頁的全部環(huán)境將傳送給定制錯(cuò)誤網(wǎng)頁。也就是說,可以使用存儲(chǔ)在任何ASP內(nèi)部對(duì)象集合或?qū)傩灾械闹。例如,如果檢索來自Request.ServerVariables集合的HTTP_REFERER值,它將反映調(diào)用原網(wǎng)頁的網(wǎng)頁(即在錯(cuò)誤出現(xiàn)之前的網(wǎng)頁)的URL。在服務(wù)器把執(zhí)行轉(zhuǎn)到錯(cuò)誤網(wǎng)頁時(shí),這個(gè)值不會(huì)發(fā)生變化,并且它將不包含當(dāng)錯(cuò)誤發(fā)生時(shí)正在執(zhí)行的網(wǎng)頁的URL。
      同樣,SCRIPT_NAME值將是包含該錯(cuò)誤的網(wǎng)頁的名字,而不是錯(cuò)誤網(wǎng)頁的URL。在一個(gè)錯(cuò)誤網(wǎng)頁已經(jīng)裝入時(shí),通過檢查瀏覽器地址欄中的URL,可以對(duì)此進(jìn)行確認(rèn)。但是在原網(wǎng)頁的腳本變量中存儲(chǔ)的值,在定制的錯(cuò)誤網(wǎng)頁中都是不可用的。
      如果原ASP網(wǎng)頁正在一個(gè)事務(wù)內(nèi)運(yùn)行,即在網(wǎng)頁的最前面包含有一個(gè)<% @TRANSACTION=”…” %>指令,也應(yīng)該確定是否需要在網(wǎng)頁中采取一些方法,以退出該事務(wù)。例如可以調(diào)用內(nèi)置ObjectContext對(duì)象的SetAbort方法:
      objectContext.SetAbort

      嗯,前端時(shí)間發(fā)過幾千垃圾郵件,全是錯(cuò)誤處理的

      Option Explicit
      Response.AddHeader "Status Code", "200"
      Response.AddHeader "Reason", "OK"
      On Error Resume Next
      Response.Clear
      Dim objError
      Set objError = Server.GetLastError()

      dim objErr, objMail, html
      set objErr=Server.GetLastError()
      Set objMail = CreateObject("CDONTS.NewMail")
      objMail.From = "s1z2d3s1@163.com"
      objMail.to= "5do8@5do8.com"
      objMail.BodyFormat = 0
      objMail.MailFormat = 0
      objMail.Subject = "QOP Error 500"
      html = "<font face='Verdana, Arial, Helvetica, sans-serif'><br>"
      html = html & "<p>Error occured at: " & now
      html = html & "<p>Referred from: " & request.ServerVariables("HTTP_REFERER")
      html = html & "<p>Url: " & request.ServerVariables("URL")
      html = html & "<p><b>Category: </b></p>" & objErr.Category
      html = html & "<p><b>Filename: </b></p>" & objErr.File
      html = html & "<p><b>ASP Code: </b></p>" & objErr.ASPCode
      html = html & "<p><b>Number: </b></p>" & objErr.Number
      html = html & "<p><b>Source: </b></p>" & objErr.Source
      html = html & "<p><b>LineNumber: </b></p>" & objErr.Line
      html = html & "<p><b>Column: </b></p>" & objErr.Column
      html = html & "<p><b>Description: </b></p>" & objErr.Description
      html = html & "<p><b>ASP Description: </b></p>" & objErr.ASPDescription
      html = html & "<blockquote>"
      html = html & "All HTTP: " & Request.ServerVariables("ALL_HTTP")
      html = html & "</blockquote></font>"
      objMail.Body = html
      objMail.Send
      objErr.clear
      Set objMail = Nothing
      Set objErr = Nothing
      response.write(html)

      這個(gè)操作起來確實(shí)很煩,看看老蓋先生的在500-100.asp里面寫了寫什么東西:


      <%
      Response.Write objASPError.Category
      If objASPError.ASPCode > "" Then Response.Write ", " & objASPError.ASPCode
      Response.Write " (0x" & Hex(objASPError.Number) & ")" & "<br>"

      Response.Write "<b>" & objASPError.Description & "</b><br>"

      If objASPError.ASPDescription > "" Then Response.Write objASPError.ASPDescription & "<br>"

      blnErrorWritten = False

      ' Only show the Source if it is available and the request is from the same machine as IIS
      If objASPError.Source > "" Then
      strServername = LCase(Request.ServerVariables("SERVER_NAME"))
      strServerIP = Request.ServerVariables("LOCAL_ADDR")
      strRemoteIP = Request.ServerVariables("REMOTE_ADDR")
      If (strServername = "localhost" Or strServerIP = strRemoteIP) And objASPError.File <> "?" Then
      Response.Write objASPError.File
      If objASPError.Line > 0 Then Response.Write ", line " & objASPError.Line
      If objASPError.Column > 0 Then Response.Write ", column " & objASPError.Column
      Response.Write "<br>"
      Response.Write "<font style=""COLOR:000000; FONT: 8pt/11pt courier new""><b>"
      Response.Write Server.HTMLEncode(objASPError.Source) & "<br>"
      If objASPError.Column > 0 Then Response.Write String((objASPError.Column - 1), "-") & "^<br>"
      Response.Write "</b></font>"
      blnErrorWritten = True
      End If
      End If

      If Not blnErrorWritten And objASPError.File <> "?" Then
      Response.Write "<b>" & objASPError.File
      If objASPError.Line > 0 Then Response.Write ", line " & objASPError.Line
      If objASPError.Column > 0 Then Response.Write ", column " & objASPError.Column
      Response.Write "</b><br>"
      End If
      %>

      此處參考了:ASP 3.0高級(jí)編程關(guān)于使用ASPError對(duì)象的屬性,有以下幾點(diǎn)值得注意的:
      · 即使沒有出現(xiàn)錯(cuò)誤,Number屬性應(yīng)該一直有一個(gè)值。如果ASP網(wǎng)頁調(diào)用GetLastError方法時(shí)沒有錯(cuò)誤出現(xiàn),該屬性的值是0。通常情況下,對(duì)ASP腳本的運(yùn)行期錯(cuò)誤,Number屬性返回十六進(jìn)制的值“0x800A0000”,加上標(biāo)準(zhǔn)的腳本引擎錯(cuò)誤代碼。例如,前面的例子對(duì)“Subscript out of Range”錯(cuò)誤的返回值為“0x800A0009”,因?yàn)閂BScript對(duì)該類型錯(cuò)誤的錯(cuò)誤代碼是“9”。
      · 當(dāng)出現(xiàn)已經(jīng)過一個(gè)錯(cuò)誤時(shí),Category和Description屬性將一直有一個(gè)值。
      · APSCode屬性的值由IIS產(chǎn)生,對(duì)大多數(shù)腳本錯(cuò)誤將為空。更多情況下,涉及外部組件使用出錯(cuò)時(shí)有相應(yīng)的值。
      · ASPDescription屬性的值由ASP預(yù)處理程序產(chǎn)生,而不是由當(dāng)前正在使用的腳本引擎產(chǎn)生的,并且對(duì)大多數(shù)腳本錯(cuò)誤而言將是空的。更多情況下,對(duì)諸如對(duì)ASP內(nèi)置對(duì)象調(diào)用無效的方法的錯(cuò)誤有相應(yīng)的值。
      · File、Source、Line和column屬性僅在錯(cuò)誤出現(xiàn)時(shí),并且在錯(cuò)誤的詳細(xì)數(shù)據(jù)是可用的情況下才能進(jìn)行設(shè)置。對(duì)一個(gè)運(yùn)行期錯(cuò)誤,F(xiàn)ile和Line屬性通常是有效的,但是column屬性經(jīng)常返回-1。當(dāng)錯(cuò)誤是一個(gè)阻止頁面被ASP處理的語法錯(cuò)誤,才返回Source屬性。一般在這些情況下,Line和Column屬性是有效的。如果把Source屬性的值寫到頁面,明智的辦法是先將該值傳給HTMLEncode,以防在其含有非法的HTML字符。在本章的后面將詳細(xì)地討論HTMLEncode方法.

      ERR對(duì)象

      Tips:這是第二次寫這個(gè)了,NND,原先寫的重點(diǎn)是ASPError對(duì)象的介紹,我現(xiàn)在介紹一下err對(duì)象,這是一個(gè)很簡(jiǎn)單易于操作的對(duì)象,let's go.,在asp頁面中.

      err對(duì)象使用的時(shí)候不需要?jiǎng)?chuàng)建實(shí)例,就是說你要用的時(shí)候隨便拿來使用,就像session一樣,不需要像ADODB對(duì)象使用的時(shí)候Set conn=Server.CreateObject("ADODB.Connection")來創(chuàng)建實(shí)例,它返回一個(gè)錯(cuò)誤代碼,但是Err!=Err.Number,可以用Clear方法清除,以利于下次使用.它主要的是個(gè)Description方法,返回的是簡(jiǎn)要錯(cuò)誤說明,這里一個(gè)很經(jīng)典的例子:

      <%@ LANGUAGE="VBscript" %>
      <%Response.Buffer = True
      On Error Resume Next
      %>
      <%
      s="sa"
      response.write(Int(s))
      If Err.Number <> 0 Then
      Response.Clear
      response.write"發(fā)生錯(cuò)誤:"%>
      <HTML>
      <HEAD>
      <TITLE></TITLE>
      </HEAD>
      <BODY>
      錯(cuò)誤 Number: <%= Err.Number %><br/>
      錯(cuò)誤信息: <%= Err.Description %><br/>
      出錯(cuò)文件: <%= Err.Source %><br/>
      出錯(cuò)行: <%= Err.Line %><br/>
      <%= Err %>
      </BODY>
      </HTML>
      <%End If%>

      運(yùn)行一看,囈,Err.Line 為空,為啥?因?yàn)閍sp的vb編寫的里面line方法不被支持,這是一個(gè)廢的屬性在vb里面.jscript的支持,要研究的去catch.

      值得注意的是要使用err對(duì)象的時(shí)候,必須加上On Error Resume Next,原來越過asperror對(duì)象的異常拋出.

      在鏈接數(shù)據(jù)庫的時(shí)候可以使用error對(duì)象: Count屬性:用來統(tǒng)計(jì)Errors集合的數(shù)目,Item方法:用來指定特定的一個(gè)錯(cuò)誤,語法為Error.Item(number),其中number為一數(shù)字。由于Item為默認(rèn)的方法,所以Error(number)的寫法與前面的寫法是等價(jià)的。下面是一段程序。用來列舉Error對(duì)象:

      <%
      On Error Resume next
      Set conn=Server.CreateObject("ADODB.Connection")
      Dim i,your_databasepath:your_databasepath="no.mdb"
      connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&server.mappath(your_databasepath)&""
      conn.open connstr
      if conn.errors.count<>0 then
      response.write "鏈接數(shù)據(jù)庫失敗<hr/>"
      for i =0 to conn.errors.count-1
      response.write conn.errors.item(i)&"<hr>"
      response.write Err.Description
      next
      else
      response.write "鏈接數(shù)據(jù)庫成功"
      end if
      conn.close
      %>

      沒啥差別和err對(duì)象,看到比較結(jié)果了么?寒死了,直接用err對(duì)象簡(jiǎn)單.

      一般建議在調(diào)試的時(shí)候用asperror對(duì)象,就是把On Error Resume next 這行rem了,就默認(rèn)用asperror拋出了.在正式運(yùn)行的時(shí)候,除非特殊要求,可以使用err對(duì)象做點(diǎn)事情.

      分享:ASP開發(fā)中有用的函數(shù)(function)集合(2)
      ASP開發(fā)中有用的函數(shù)(function)集合,挺有用的,請(qǐng)大家保留! '************************************* '過濾超鏈接 '************************************* Function checkURL(ByVal ChkStr) Dim str:str=ChkStr str=Trim(str) If IsNull(str) Then chec

      來源:模板無憂//所屬分類:ASP教程/更新時(shí)間:2012-06-11
      相關(guān)ASP教程