程式調試—發現及處理錯誤

來源:互聯網
上載者:User
程式|錯誤


    讀完上面內容,讀者一定很想建立一個沒有錯誤的ASP網頁。但你可能會發現網頁並不能工作。怎麼辦,只有進行測試。 在這一部分,首先簡要看一下能使調試更容易的一些工具。Microsoft Script Debugger試圖把調試支援工具提高到像Visual Basic、Delphi和Visual C++等大多數傳統編程環境的水平。然而,下面將首先討論一些更傳統的有助於跟蹤出現在網頁中的錯誤的技術。
7.5.1 常規調試技術
       在第2章中,已經看到如何使用Response.Write方法以及Request集合來顯示集合的內容。如果代碼要使用來自請求的值,首先要做的是保證所需的值存在。很容易出現的問題是錯拼或改變的<FORM>網頁中HTML控制項的名字,或者建立附加在URL後面的查詢字串時出現了錯誤的用戶端。
1.  顯示各種集合內容
當程式試圖使用使用者提供的值運行時,可能沒有得到所期望的結果,或者什麼結果也沒得到。記住,引用Request對象的集合中一個並不存在的值(例如,在表單上沒有一個名為“ThisControl”的控制項時,使用Request.Form("ThisControl")不會引起錯誤。結果可能只得到一個Null 字元串。如果期望尋找儲存在使用者的Session對象或全域Application物件變數中的數值,同樣可能出現這種情況。
如果建立一個頁面用來顯示所有Request對象集合、Session和Application對象的Contents和StaticContens集合的內容,可以任何網頁使用Server.Execute對其進行訪問。所需要做的工作是把下面程式行加到ASP網頁中,用來顯示集合的全部內容。當然,根據伺服器上檔案存放的位置,必須給檔案設定相應的路徑。
<% Server.Execute "/path_to_file/debug_Request.asp" %>
這是一種很好的方法,保證我們希望在Request、Session和Application集合中找到的任何值確實存在,並且包含了合適的值。在本書的樣本檔案Chapter07子目錄中提供了一個相應的檔案,取名為debug_Request.asp。它基本上是用於第2章的show_request.asp網頁和用於第3章的show_application.asp和show_session.asp網頁的一個組合,但刪除了部分HTML程式碼。它只是簡單地遍曆了集合并把值放到當前頁面中。
可以通過運行“Custom Error Page”執行個體來查看這個頁面。這個執行個體在本章前面看到過,開啟時請選中“Display debugging information”複選框,或者直接在chapter07目錄中的主菜單網頁中開啟。
2.  顯示中間值
在網頁中查看運行情況的第二個方法是顯示網頁運行時變數的值.當大概知道了錯誤來自何處,哪個變數在起作用時,這種傳統技術還是不能廢棄的。但由於IIS 5.0網頁緩衝方式的改變,使得使用這項技術比較困難。
在ASP和IIS的先前版本中,預設時關閉頁面緩衝,並且幾乎沒有人想到將緩衝開啟(使用Response.Buffer = True開啟),除非想使用Response.Redirect完成網頁的再定向(參看第2章)。響應多個請求時,由於緩衝減小了網頁間切換的次數,從而提高了IIS的效率。
然而,當出現一個使運行停止的運行期錯誤時,IIS自動調用Response.Clear方法,再調用Server.Execute來裝入定製錯誤網頁,因此寫進網頁的任何輸出都丟失了。解決方案是暫時增加下面的程式行:
<% Response.Buffer = False %>
此程式行放在頁面頂部<@LANGUAGE...>指令後面,任何由Response.Write語句產生的調試輸出將出現在定製錯誤網頁的頂部。記住在完成網頁調試之後將它去掉。
強行使程式運行通過一個錯誤點,然後顯示可疑的變數值,這種方法有時也是有用的。只需在網頁開始處附近增加On Error Resume Next語句,然後就能訪問Err對象(在VBScript中),並顯示錯誤號碼、錯誤源和描述。
3.  檢查組件屬性值
如果使用的組件具有在ASP指令碼代碼中設定的屬性,在完成設定之後,並且調用組件方法之前和之後,能通過顯示所有屬性(或僅是可疑的屬性)來跟蹤錯誤。當一個方法運行時,可能發現屬性值意外地被組件改變了,這或許是故意的,或者是因為組件中的缺陷。沒有親自檢查實際代碼,不要做任何假設。

7.5.2 Microsoft Script Debugger
       當開發更複雜的處理實際任務的應用程式時,經常需要一個更加強大的工具來進行調試。Microsoft Script Debugger(微軟指令碼調試器)是一種允許調試運行在客戶機和伺服器上的指令碼的調試工具。它能用於任何啟用ActiveX的指令碼語言(包括VBScript和JScript)編寫的程式,也能夠用來調試對Java applet、Java Bean和ActiveX組件的調用。
       在研究這個工具之前,先簡要說明一些問題。如前所述,ASP應用程式由兩種指令碼組成,一種是用戶端指令碼,一種是伺服器端指令碼。用戶端指令碼通常由VBScript或JScript指令碼語句組成,當其到達用戶端時出現在HTML頁面中並在此執行,可能是在載入文檔時或是在對一些事件的響應中。伺服器端指令碼通常也由VBScript或JScript語句組成。當瀏覽器請示網頁時,伺服器端指令碼由IIS執行。在下面的討論中,將討論區伺服器端指令碼調試的方法。然而所討論的許多技術也可用於用戶端指令碼調試。
1.  伺服器端的調試
為了調試伺服器端指令碼,在運行IIS的電腦上運行指令碼調試器,然而在使用指令碼調試器之前,必須啟用調試。為了使效能最佳化,基於ASP的應用程式在預設情況下關閉了調試功能。
注意,不要對生產性的應用程式(即處於活動狀態的並被他人使用的公用網站)開啟調試功能。這樣會減慢整個應用程式的運行,並且錯誤能使網頁出現不確定的停止運行情況。
調試僅能為虛擬應用程式和整個Web網站進行設定,為了啟用調試,開啟應用程式或網站的Properties對話方塊,在Home Directory選項卡中,點擊Configuration按鈕,在Application Configuration對話方塊的App Debugging選項卡中,選擇Enable ASP server-side script debugger,如圖7-22所示。下面準備調試我們的應用程式。

注意Application Configuration對話方塊包含一個複選框,能夠啟用用戶端指令碼調試。這一點在IIS 5.0中沒有實現,在文檔中僅標記為“reserved for future use”。如果通常的500-100.asp定製錯誤頁面不可用,Script Error messages部分中包含將文本。
(1)    處理伺服器指令碼
不像用戶端指令碼,基於ASP應用程式指令碼不是事件驅動的。當用戶端要求一個來自伺服器的網頁時,伺服器讀取網頁內容,並處理所有的伺服器指令碼(即在<%...%>和<SCRIPT RUNAT="SERVER"></SCRIPT>段中的所有內容),也包括在HTML文本中的“行內”指令碼段內容,例如:
The valve of the result is: <% = strResult %>
處理流程顯示在圖7-23所示的框圖中:

當IIS載入網頁時將處理ASP頁面中的所有指令碼,在任何輸出送給用戶端之前,ASP及指令碼引擎能夠捕獲文法和運行期錯誤(除非你關閉緩衝或調用Response.Flush方法)。
(2)    指令碼調試器提供的協助
啟用指令碼調試時,如果出現錯誤,在伺服器螢幕上可以看到一個描述ASP代碼錯誤的對話方塊,點擊OK,然後調入當前ASP網頁的一個唯讀拷貝,開啟的指令碼調試器,錯誤出現的行由箭頭指示,如圖7-24所示:

這裡,錯誤的產生是由於出現了Page Counter對象方法的名字錯誤,應是PageHit而不是DoPageHit。同時,指令碼調試器找到了錯誤並且終止了頁面的運行,工具條上的按鈕用於程式的繼續運行、單步程式運行或者終止頁面的處理。
工具條最右邊的按鈕開啟指令碼調試器中的Immediate視窗,可以用它和頁面進行互動,並且很可能找到出錯的地方。例如,可以查詢或者設定變數值或組件屬性,可以執行內建函式和子程式、自訂函數和子程式以及已經建立的對象方法等。在圖中,調用了Page Counter組件的PageHit方法,然後查詢Hits屬性以得到正在啟動並執行指令碼中該處的值。
為了瞭解為什麼在“公用”網站上不應使用指令碼調試器,可以從客戶機上開啟一個包含伺服器端錯誤的頁面。在這種情況下,錯誤資訊對話方塊出現在伺服器上,指令碼調試器也在伺服器上開啟。在客戶機上,直到運行在伺服器上的指令碼調試器關閉,才開始載入該頁面。
(3)    啟動和使用調試器
啟用指令碼調試後,虛擬應用程式的網頁中出現錯誤時,指令碼調試器自動啟動。還可以人工啟動指令碼調試器,在Windows 2000的Start菜單(Programs|Accessories|Microsoft Script Debugger)中完成。相應地,也可在想開啟指令碼調試器的地方把一個Stop語句插入ASP程式中,當運行至Stop語句時,IIS會終止ASP程式的執行,啟動指令碼調試器,顯示當前頁面並指出含有Stop語句的當前行。
指令碼調試器能完成下列工作:
· 查看正在或已經啟動並執行文檔的列表,並從中選擇一個進行查看或編輯。
· 在開啟的網頁中設定一個新斷點,頁面在該點停止運行以便進行調試。
· 單步調試,一步運行一條語句,可選地執行子程式和函數。
· 查看調用棧(Call Stack),顯示程式中在該點被調用的嵌套子程式或函數。
1.  指令碼調試器的技巧和竅門
下面是使用Microsoft Script Debugger時,有助於找到指令碼中錯誤的一些竅門。
· 如果調試伺服器端指令碼,為ASP應用程式啟用指令碼調試器。否則,錯誤資訊將作為文本傳送給用戶端的瀏覽器,並且不能對伺服器端指令碼使用指令碼調試器。
· 調試完成後,關閉調試功能,否則會降低伺服器效能,並且錯誤的頁面會停留在用戶端。
· 對於一個或更多的ASP應用程式,如果啟用指令碼調試器,將傳送給它所有的伺服器錯誤,包括那些遠程客戶訪問網頁時出現的錯誤。因此,除非能在自己的伺服器上調試,否則不要啟用指令碼調試器。
· 如果在一個沒有安裝在伺服器上的瀏覽器中工作,並且在網頁中顯示錯誤,則錯誤在伺服器端指令碼中。如果一個錯誤資訊出現在對話方塊中,則錯誤在用戶端指令碼中。
· 如果在.asp檔案中有一個文法或運行期錯誤,並且已經對這個ASP應用程式啟用調試功能,用戶端瀏覽器將不顯示語法錯誤(除非瀏覽器運行在伺服器上),僅顯示逾時或不能開啟網頁。
· 在表明伺服器端指令碼中是否有錯誤的訊息中,顯示的行號指的是包含這個錯誤的.asp檔案的相應行。
· 如果在由.asp檔案建立的用戶端指令碼中有錯誤,行號並不指向.asp檔案的錯誤行,而是指向錯誤出現的.asp檔案的HTML輸出行。為了查看這行,應在客戶瀏覽器中查看HTML檔案的來源程式。
· VBScript和JScript錯誤碼在附錄D中。

7.5.3 獲得ASP的協助和支援
       如果遇到一個不能處理的錯誤,或者看來像ASP中的一個“bug”的事情,最好能夠尋求協助以解決這個問題。關於ASP在Web上有許多有用的資訊源,第1 章後面我們列舉了許多。但是,對一些特殊問題,確實需要一些更直接的協助。
       在電腦上安裝的ASP和IIS文檔是一個好起點,並且能通過瀏覽器的URL為http://yourservername/iishelp/進行訪問。運行Windows 2000的附加組件設定或主設定程式(依賴於安裝的Windows 2000版本)時,應保證安裝了全部的文檔。
       也可以從“Microsoft for Windows 2000”得到的完整平台SDK,其中包含了大量關於Windows和Windows 2000中Internet服務的附加資訊。它包含完整的VBScript和JScript參考。它可以從微軟獲得,並提供給MSDN成員。指令碼參考文檔可單獨獲得,也可以從“http://www.microsoft.com/scripting/”網站下載。也可從這裡獲得指令碼調試器。
微軟開發人員網路(The Microsoft Developer's Network,MSDN)Web網站也提供了許多支援和協助,即使這部分資訊有時難以找到。還可以從Workshop網站(http://msdn.microsoft.com/workshop/)開始,這個網站在左邊導覽列中有很好的索引和一系欄位標題。
另外,位於http://msdn.microsoft.com/Library/default.htm的主MSDN庫包含有文章、基礎知識、FAQ和其他用於IIS和ASP的支援材料,左邊視窗使用一個Java擴充清單控制項,使使用者很容易進行尋找。
如果需要特別的協助,或者需要向其他開發人員提出一些問題,在msnews.microsoft.com網站上有一些有用的新聞群組。還可以訂閱microsoft.public.inetserver.iis、microsoft.public.inetserver.activeserverpages和microsoft.public.inetserver.iis.misc。一些ASP網站也提供有關ASP方面的討論話題、論壇或聊天室。

7.6 小結
       本章討論的內容是大多數編程者最不喜愛的工作。即使最簡單的指令碼,也不可能就能第一次正確地工作。隨著ASP提供越來越多的特性,在指令碼中出現錯誤的機會也增加了。瞭解如何發現並處理錯誤的相關基本知識,是非常必要的。
       通過分析可能出現的不同種類的錯誤,弄清楚預設的ASP和指令碼引擎錯誤處理系統捕獲錯誤的機理,防止把錯誤和無效資料傳給其他的應用程式。編程時出現的錯誤越少,越容易發現和解決它們。
       然而,好的編程習慣並不能阻止某些種類的錯誤發生,例如那些由外部資源和服務造成的錯誤。這意味著提供自己的定製錯誤處理代碼,在出現錯誤時知道如何跟蹤錯誤並進行妥善處理,是非常重要的。
       最後,以對Microsoft Script Debugger的闡述結束了本章,它是有助於找到和解決網頁中的運行期錯誤的一個有用的工具。它可以暫停程式執行和進行逐步執行,同時還能夠觀察程式在進行什麼,甚至能夠和指令碼進行互動。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。