在 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 中启用脚本调试

概念

了解 ASP 脚本处理

其他资源

调试 ASP 应用程序