偵錯 ASP 網頁中的指令碼物件
若要偵錯 ASP 網頁中的指令碼物件,您應該考慮下列項目:
什麼是指令碼物件模型
偵錯與指令碼程式庫
啟用指令碼物件偵錯
報告錯誤
追蹤事件
追蹤警告
什麼是指令碼物件模型
ASP 指令碼物件模型定義了一組具有事件、屬性和方法的物件,您可以在 Web 應用程式中使用這些物件。 大部分的指令碼物件代表使用者介面、像按鈕和文字方塊這樣的項目,和類似 Microsoft Visual Basic 中控制項的函式。
Visual Studio 2010 中的指令碼物件不需要特殊的執行階段。您使用物件時的 ASP 網頁所包含的指令檔會包含它們的定義。 雖然這些檔案只是指令碼,但它們會封裝 ActiveX Data Objects (ADO) 命令與 HTML 項目,以建立可支援事件驅動程式設計的複雜物件。
每一個指令碼物件都有兩個版本:一個在伺服器上的 ASP 中執行,適用一般 HTML 3.2 瀏覽器,另一個則在用戶端的 Internet Explorer 4.0 (含) 以後版本中執行。 這兩個版本的程式撰寫模型 (事件、方法和屬性) 完全相同。 您可以直接從程式碼建立及使用指令碼物件,或是利用設計階段控制項的協助來建立及使用指令碼物件。 儲存 ASP 網頁時,指令碼物件程式碼會以標準 HTML 和指令碼的組合方式存留下來。
偵錯與指令碼程式庫
因為指令碼物件本身是以指令碼編寫而成,偵錯會與指令碼物件模型互動的指令碼可能很複雜,原因如下:
首先,當您使用偵錯工具逐步偵錯指令碼時,可能會在碰到指令碼程式庫中不熟悉與複雜的程式碼時結束。
其次,如果指令碼程式庫內發生了錯誤,進行逐步偵錯時可能會讓人心煩氣躁,並且可能無法幫您找出錯誤。
最後,您有時候會很難追隨事件的順序以及指令碼與指令碼物件模型之間的控制流程。
現在,經由利用下列指令碼物件模型偵錯選項,您就可以在這些狀況下偵錯應用程式:
攔截低階錯誤:如果指令碼物件 (例如 Recordset 物件) 發生了錯誤,它會以詳細的錯誤訊息來警示您。 這個選項可協助您找出可能是外部原因而失敗的元件錯誤。
追蹤事件:您可以讓頁面顯示在發生時就會引發之事件的清單, 這個選項可協助您查看指令碼是在相對於指令碼物件模型事件的何時執行。
追蹤警告:您可以查看指出可能錯誤的警告訊息,這些錯誤在發生時不會顯示任何訊息。 這個選項可協助您找出像是將無效的參數傳遞給方法所造成的問題。
啟用指令碼物件偵錯
ASP 網頁通常會在頂端包括具有偵錯選項的指令碼區塊。 根據預設,這些選項是處於停用狀態。 指令碼區塊看起來像這樣:
<SCRIPT id=DebugDirectives runat=server language=JScript>
// Set these to true to enable debugging or tracing
@set @debug=false
@set @trace=false
</SCRIPT>
進行指令碼物件偵錯時,伺服器上必須執行 JScript 5.0 (含) 以上版本, 您可以從 Microsoft 網站將 JScript 5.0 版下載到伺服器上。
若要啟用偵錯功能,請將您要的偵錯選項設為 true。 例如,若要攔截低階錯誤,請將此區塊變更為:
<SCRIPT id=DebugDirectives runat=server language=JScript>
// Set these to true to enable debugging or tracing
@set @debug = true
@set @trace = false
</SCRIPT>
偵錯選項區塊必須緊接在 ASP 網頁頂端 @language 指示詞的後面。
您總共可以設定四個選項,如下列清單所述:
名稱 |
目的 |
---|---|
@debug |
報告特定指令碼物件中選擇的錯誤 |
@trace |
啟用下列兩個追蹤選項 |
@trace_events |
啟用事件追蹤 |
@trace_warnings |
針對發生時通常不會顯示訊息的可能錯誤開啟警告。 |
本主題稍後將會詳細說明每一個設定。
注意事項 |
---|
如果您將 @trace 設為 true,它會覆寫 @trace_events 和 @trace_warnings 的設定, 不過,如果 @trace 是 false,您可以個別啟用或停用每一個追蹤選項。 |
個別的追蹤選項並不是 ASP 網頁中預設指令碼區塊的一部分,所以如果您想要個別進行設定,就必須加入追蹤選項。 例如,下列範例只會啟用事件追蹤,而不會啟用警告功能:
<SCRIPT id=DebugDirectives runat=server language=JScript>
@set @debug = false
@set @trace = false
@set @trace\_events = true
</SCRIPT>
如果您是使用 Microsoft Internet Explorer 4.x,則設定任一 @trace 選項都會覆寫 BODY 標記,這可能會停用 BODY 標記中的事件繫結,並且會使屬性遭到忽略。 如果您使用 Internet Explorer 5.0 (含) 以後版本,就不會發生這個問題。
在 Internet Explorer 4.0 中,下列事件繫結方式沒有作用:
<BODY onload="initialize()">
若要解決這個限制,請使用不同的繫結機制。 如果您是使用 Visual Basic 指令碼版本 (VBScript),就可以使用隱含繫結:
<SCRIPT LANGUAGE="VBScript">
Function window_onload()
initialize()
End Function
</SCRIPT>
如果您是使用 JScript,可以呼叫會將函式指標指派給視窗物件事件的全域指令碼,如下所示:
<SCRIPT LANGUAGE="JScript">
window.onload = initialize
</SCRIPT>
如果 BODY 標記目前包含屬性,您應該在指令碼中進行設定,而不是設定文件物件的屬性。 例如,如果 BODY 標記目前包含屬性 BGCOLOR="#FFFF00",您可以使用指令碼來設定它,如下所示。 當文件首次載入時,請使用本章節先前所示的技巧來呼叫這段指令碼。
<SCRIPT LANGUAGE="JScript">
function initialize(){
document.bgColor = "#FFFF00";
}
</SCRIPT>
報告錯誤
有些指令碼物件會和網頁外的其他物件互動。 例如,Recordset 物件會使用 ADO 來存取資料庫。 如果在這類互動期間發生錯誤,外部物件所報告的錯誤資訊可能會讓人覺得模稜兩可,或是在網頁內容中顯得不完整。
@debug 選項會啟用報告機制,此機制會攔截及解譯一組常見的這類錯誤。 錯誤資訊會寫入 ASP 網頁,並會與網頁的一般內容一起顯示, 在某些情況下,還會顯示基礎錯誤訊息。
例如,如果 @debug 是設為 true,而且 Recordset 物件試圖執行無效的 SQL 陳述式,那麼您可能會在網頁中看見像下面這樣的訊息:
SCRIPTING OBJECT MODEL EXCEPTION:
FILE: recordset.asp
FUNCTION: Recordset1.open()
DESCRIPTION: Failed to open the ADO recordset. Check for the following
possible causes:
An invalid SQL statement.
Missing or invalid database object name (check Recordset DTC properties)
Missing parameters or parameter type mismatch (parameters must be set
before recordset is opened).
追蹤事件
當 ASP 網頁使用指令碼物件模型時,個別的指令碼物件會引發事件以回應狀態變更 (例如 Recordset1_ondatasetcomplete) 或是回應使用者動作 (例如 Button1_onclick)。 通常,您需要知道相對於指令碼物件模型所引發的事件,您的指令碼是在何時執行。
若要這麼做,請將 @trace 或 @trace\_events 選項設為 true,以啟用事件追蹤。 當您啟用事件追蹤時,就會在事件發生時將事件資訊寫入 ASP 網頁。 例如,ASP 網頁的某部分看起來可能像這樣:
EVENT TRACE: thisPage fired oninit event.
EVENT TRACE: Recordset1 fired onbeforeopen event.
EVENT TRACE: Recordset1 fired onrowenter event.
EVENT TRACE: Recordset1 fired ondatasetchanged event.
EVENT TRACE: Recordset1 fired ondatasetcomplete event.
若要判斷指令碼是在何時執行,請在重點處加入 Response.Write 陳述式,如下列指令碼所示。 這個範例會依據文字方塊中的資訊來設定資料錄集的參數, 而且會在網頁上顯示每一個步驟,以此方式來報告每一個步驟。
Sub btnQuery_onclick()
Recordset1.close()
Response.Write("Finished closing recordset.")
Recordset1.setParameter 1, txtLastName.value
Response.Write("Finished resetting query parameter.")
Recordset1.open()
Response.Write("Finished reopening recordset.")
End Sub
經由使用 JScript 條件式編譯命令,您只要設定偵錯選項就可以指定 Response.Write 陳述式會出現在網頁中。 例如,在下列區塊中,只有當 @trace 選項是設為 true 時,才會執行 Response.Write 陳述式:
@if (@trace)
Response.Write("Ready to set SQL statement parameters.");
@end
您不一定要使用偵錯選項,也可以自己建立條件旗標,如下列範例所示:
@set @trace\_custom = true
' ... other script here
@if (@trace_custom)
Response.Write("Ready to set SQL statement parameters.");
@end
注意事項 |
---|
讓網頁實際執行之前,請記得將所有偵錯條件設為 false。 |
如需條件式編譯的詳細資訊,請參閱 Microsoft Scripting 網站的<陳述式>章節中的 @if 和 @set 命令。
追蹤警告
使指令碼物件盡可能地健全,並且盡量減少不想要的顯示
ASP 網頁上的資訊,指令碼物件通常不會報告非嚴重錯誤。 例如,如果您將無效的值傳遞給指令碼物件的方法,而如果該值並不會造成物件完全失敗,則物件經常會繼續執行而不顯示任何錯誤訊息。 當您在開發應用程式時,一般而言,都會想要知道指令碼物件是否遇到了問題, 沒有報告出來的問題有時候可能會在稍後的網頁執行期間造成其他問題,讓您更難偵錯網頁。
將 @trace 或 @trace\_warnings 選項設為 true 以追蹤警告,即可解決這個問題。 如果指令碼物件遇到任何潛在問題,就會將資訊寫入網頁,格式如下所示:
WARNING TRACE:
FILE: recordset.asp
FUNCTION: Recordset1.open()
DESCRIPTION: Recordset is already open.
請參閱
工作
HOW TO:在 Internet Explorer 中啟用指令碼偵錯