ASP 3.0進階編程(三十)

來源:互聯網
上載者:User
編程|進階 第7章 調試和錯誤處理
前面已經介紹了使用ASP所需要的基本技能,本章要討論的另外一個問題是當ASP出現錯誤時怎麼辦,ASP出錯時是什麼情況。當精心編排的ASP頁面出現問題停止了執行時,使用者一般得到的僅是一些用處不大的建議,諸如:點擊[重新整理] 按鈕,或者“與網站的Web管理員聯絡,告訴他們你的頁面不能正常工作了”等等。
本章除了提供有用的資訊外,還想提供一個協助地區。我們將詳細介紹在指令碼和頁面中錯誤如何出現,可能產生的錯誤類型,以及什麼造成了這些錯誤。更重要的是,要討論如何儘可能避免錯誤的發生,如不能避免又如何妥善處理。
因此,本章將要探討頁面調試技術,也就是如何花費不多的精力和時間就能找到錯誤並解決問題。
本章包括以下內容:
· 能夠出現的錯誤類型。
· 如何防止各種錯誤的產生。
· 如果不能防止錯誤發生,如何妥善處理這些錯誤。
· 如何發現和處理指令碼錯誤及其他類型的錯誤。
· 如何使用定製的錯誤頁面得到錯誤資訊。
· 如何記錄發生的錯誤以監視我們的網站。
· 建立一個定製錯誤網頁和一個錯誤記錄檔檔案。
· 提供相關的線上協助。
本章不涉及如何處理使用ActiveX Data Objects(ADO)訪問資料來源時出現的各種特殊類型的錯誤。像許多組件一樣,ADO提供了自己的錯誤處理系統,第8章將深入討論這一點。本章將從討論能出現的各種錯誤類型開始,使我們能夠認識這些錯誤並採取相應的措施。
據說,在非洲最黑暗的雨林深處,有這樣一群程式員,他們的程式碼從來沒有出現過錯誤。但是,很遺憾他們從沒有享受過調試一段不能正常工作的應用程式的樂趣。偵錯工具代碼是一個真正充滿快樂的工作,所以我們要面對這個問題,在偵錯工具的過程中檢驗我們的觀察力和橫向思維能力。大多數“真實世界”的程式員能夠體驗這些樂趣是一件好事。
當然,有些人會說,偵錯工具與其說是判斷,不如說是碰運氣。花費了許多時間去調試一段有錯誤的程式,在某種程度上可以說確實是依賴運氣。但是,如果第一步從合適的地方開始查看,可能會更快地解決問題。
但這不是程式調試應採取的辦法。從理論上講,當某段程式運行失敗時,應該以邏輯或順序方式跟蹤錯誤。作為一個聰明和有經驗的程式員,這才是調試時常用的方法,只有業餘人員才隨意改變程式中變數的值,到處添加Response.Write語句進行調試。
然而,為了能夠在邏輯上跟蹤程式中的錯誤,必須瞭解有關錯誤如何出現方面的基礎知識,更重要的是知道錯誤出現在哪裡,以便很快就能找到相應的地方。本章討論的內容是有關程式中能夠出現的不同種類的錯誤,錯誤的不同表現,以及如何記錄和排除這些錯誤。同樣重要的是,還將介紹如何避免這些錯誤的發生。
本章將從介紹可能出現的不同種類的錯誤開始,如果認為你的代碼不會出現任何錯誤,可以直接跳到下一章。

7.1 錯誤的種類

7.1.1 文法或“編譯”錯誤
當我們第一次運行新編寫的程式碼時,通常看到的第一種錯誤類型是“syntax error”。這就是所說的,程式碼上的語法錯誤。這就像在寫作中使用了錯誤的文法,使讀者不能瞭解其中的含義。而解譯器(諸如指令碼引擎)和編譯器對文法要求得更加嚴格和準確。
語法錯誤通常也是最早出現和需要排除的。大多數情況下,解譯器和編譯器會指出行號和所在行中的字元位置,以及在相應的位置上缺少的內容。下面舉一個簡單的例子,如下所示的這樣一段程式:
<%
Response.Write "The repayments for your loan are $" & chrPayment _
& " per " & strInterval & , due on the " &strDay & " of each "
& strInterval & "."
%>
我們希望得到下面的結果:
The repayments for your loan are $124.50 per month, due on the 12th of each month.
實際上得到的結果如圖7-1所示:

圖7-1 程式執行結果1
豆豆註:
如果你的錯誤提示資訊無法出現“語法錯誤”,請將你的WINNT\Help\iisHelp\common\500-100.asp做如下改變(加了兩行黑體字):
...
Dim bakCodepage
bakCodepage = Session.Codepage
Session.Codepage = 936
Response.Write Server.HTMLEncode(objASPError.Category)
If objASPError.ASPCode > "" Then Response.Write Server.HTMLEncode(", " & objASPError.ASPCode)
Response.Write Server.HTMLEncode(" (0x" & Hex(objASPError.Number) & ")" ) & "<br>"

If objASPError.ASPDescription > "" Then Response.Write Server.HTMLEncode(objASPError.ASPDescription) & "<br>"

blnErrorWritten = False

Response.Write "<B>"

If objASPError.Description > "" Then Response.Write Server.HTMLEncode(objASPError.Description) & "<br>"

' Only show the Source if it is available and the request is from the same machine as IIS

檔案中第3行是Response.Write語句的第2行。報告錯誤資訊時,VBScript解譯器忽略一行中的引導空格和定位字元。所以在數完26個字元之後,可以找到語法錯誤的地方,這裡明顯缺少了一個雙引號。加上雙引號後再運行這個頁面,我們可以得到如圖7-2所示:

圖7-2 程式執行結果2
這次又是另外一個簡單錯誤。實際上錯誤出現在第3行而不是第4行。我們漏掉了第三行末尾的續行符'_'。程式碼應該是:
<%
Response.Write "The repayments for your loan are $" & chrPayment _
& " per " & strInterval & ", due on the " &strDay & " of each " _
& strInterval & "."
%>
1. 錯誤出現在什麼地方
需要注意的是指令碼解譯器僅指出所發現錯誤的地方,但實際上那兒並不一定是錯誤真正出現的地方。在上例中,前面三行的文法正確的;併產生相應的輸出結果,而恰恰是第4行引起問題,因為這一行是以一種非法字元開頭的,指令碼解譯器沒有意識到這一行是上一行的一部分。
這樣的錯誤是普遍存在的,因為通常我們主要考慮的是要輸出的常值內容,而不是雙引號、連字號(在VBScript中為“&”)、續行符等的正確順序。
對於關鍵字、內建函式名拼字錯誤或函數的非法參數列表而引起的語法錯誤,通常比較容易發現,因為錯誤資訊提示可能就指出了錯誤的實際位置。例如:下面這段代碼是想把明天的日期寫入頁面。
Response.Write DateAdd(Now(),"d", 1)
實際得到的結果如圖7-3所示:



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

11.11 Big Sale for Cloud

Get Unbeatable Offers with up to 90% Off,Oct.24-Nov.13 (UTC+8)

Get It Now >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。