在 ASP 页中调试脚本对象
更新:2007 年 11 月
若要调试 ASP 页中的脚本对象,应考虑下面因素:
脚本对象模型是什么?
调试和脚本库
启用脚本对象调试
报告错误
跟踪事件
跟踪警告
脚本对象模型是什么?
ASP 脚本对象模型定义了一组包含事件、属性和方法的对象,您可以在 Web 应用程序中使用这些对象。多数脚本对象表示用户界面、按钮和文本框等元素以及形式类似于 Microsoft Visual Basic 中的控件的功能。
Microsoft Visual Studio 2005 中的脚本对象不需要特殊的运行库;使用对象时,ASP 页包含的脚本文件中定义了这些对象。虽然这些文件只是脚本,但它们封装了 ActiveX 数据对象 (ADO) 命令和 HTML 元素,可用于创建支持事件驱动编程的复杂对象。
每个脚本对象有两个版本:一个版本在泛型 HTML 3.2 浏览器的 ASP 服务器上执行,另一个版本则在 Internet Explorer 4.0 或更高版本的客户端上执行。这两个版本的编程模型(事件、方法和属性)完全相同。可以直接从代码创建和使用脚本对象,或是借助 Design-Time 控件创建和使用脚本对象。保存 ASP 页后,脚本对象代码便可以保留为标准 HTML 和脚本的组合。
调试和脚本库
由于脚本对象是自行写入脚本中的,因此对您写入的与脚本对象模型交互的脚本进行调试可能很复杂,原因如下:
首先,使用调试器逐步调试自己的脚本时,您可能因为在脚本库中遇到不熟悉和复杂的代码而停步。
其次,如果脚本库中出现错误,逐步调试可能变得很枯燥并且可能对找出错误毫无帮助。
最后,有时很难遵循脚本与脚本对象模型之间的事件顺序和控制流。
现在,您可以使用以下脚本对象模型调试选项来调试应用程序:
捕捉低级错误 — 如果脚本对象(例如 Recordset)遇到错误,它会以详细的错误信息发出警告。该选项可以帮助您找出可能由于外部原因而失败的组件错误。
跟踪事件 — 您可以让页面显示事件发生时激发的事件的列表。该选项可以帮助您确定脚本相对于脚本对象模型事件的执行时间。
跟踪警告 — 您可以看到表明潜在错误的警告消息,这些错误原本是静默发生的。该选项可以帮助您找出一些问题,例如,由于向方法传递了无效参数而导致的问题。
启用脚本对象调试
ASP 页通常在开头处包含带有调试选项的脚本块。默认情况下,这些选项是关闭的。脚本块如下所示:
<SCRIPT id=DebugDirectives runat=server language=javascript>
// 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=javascript>
// 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=javascript>
@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 Scripting Edition (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.
请参见
任务
如何:在 Internet Explorer 中启用脚本调试