我们在开发程序的时候难免会发生错误,这些错误有时是程序设计师在编写程序代码时不小心打错,有时是客户端使用者因操作不当而引发的;即使再小心的程序设计师也不可能完全避免程序出错。因此如何避免错误、找出错误便成了程序设计中不可缺少的一环。程序的错误大致可分为三种,分别为语法错误、执行时期错误,以及逻辑错误。
语法错误(syntax error)
程序在撰写的时候没有按照规定的语法就会出错。这种错误较为常发生在初学者,例如关键词拼错、有if 却忘了加then、字符串没有用双引号围起来等,都会引发语法错误;但这一类错误会随着对程序语言的熟练度而渐渐减少。
执行时期错误(runtime error)
程序在执行时所发生错误即为执行时期错误。例如以0 作为除数导致程序无法继续执行,如下列程序代码片段所示:
x=1/0
这个程序的语法并没有错误。但是0 不可为除数,因此执行到这一行时便会引发执行时期错误。要解决执行时期错误必须另外加入错误处理程序,有关错误处理的方法我们在后面章节再讨论。
逻辑错误(logic error)
程序执行的结果不是我们所预期的,便称为逻辑错误。这可能是因为程序设计师的观念就本身就不正确,所以这种错误并不好发现。因为程序的语法内容并没有错,要解决这类的问题必须配合一些工具和方法,才能找出错误的地方。
以程序代码来除错
在程序代码中加入除错用的程序代码来除错是最直接的方法。以逻辑错误来说,因程序本身并没有任何语法错误存在,大多是变量的内容或程序执行流程上出了问题;因此将程序执行过程中的变量值显示出来可以帮助我们了解变量的变化,进而找出程序的问题出在哪里。下列范例以程序代码来显示变量的内容:
<html>
<asp:label id="label1" runat="server" />
<script language="vb" runat="server">
sub page_load(sender as object, e as eventargs)
dim i as short
dim j as short
j=10
for i=0 to 10
i=i+1
next
response.write("i: " & i.tostring & "<p>") '将变数i 的值印出
j=j+i
label1.text="执行结果为:" & j.tostring
end sub
</script>
</html>

上述例子程序在执行时一点问题也没有,我们预期最后的显示值是20,可是却出现22 这个不符合我们答案的数字;这时我们可以利用response.write 方法显执行完循环后的变量i 的内容。这个范例很单纯的植入检查变量值的叙述,在某些单纯的网页上使用有其便利性;不过程序代码一但复杂,所要检视的元素也会相对的成长,所以我们使用一些asp.net 提供的追踪程序方法较方便。
观察错误讯息
我们故意撰写一个错误的程序,然后以浏览器浏览:
<html>
<form runat="server">
<asp:button id="button1" text="click" onclick="button1_click"
runat="server" /><p>
<asp:label id="label1" runat="server" /><p>
</form>
<script language="vb" runat="server">
sub button1_click(sender as object,e as eventargs)
label1.text=2/0
end sub
</script>
</html>

由上图我们可以清楚的了解程序的错误类型以及错误的位置。上面这个程序在编译时期就出错误,原因是我们在运算时使用0 当除数,所以发生除0 错误。
trace 功能
在对程序进行除错工作的同时,都希望能够有系统的整理这些除错讯息。可是以往的网页程序设计并不提供这样的功能,必须使用一堆如response.write() 方法来显示所需要信息,既不清楚又没有效率。现在asp.net 提供了一个新的对象来方便我们除错,那就是trace 对象。trace对象是page 对象的成员,因此不需另行宣告就可直接使用,它的正确类别名称为tracecontext。trace 对象会列出整个网页的每一个请求等讯息,并且将这些信息整理好。要使用trace 对象,首先要在网页的开头处加上如下的宣告:
<%@ page trace="true"%>
如下面这个程序:
<%@page trace="true"%>
<html>
<form runat="server">
<asp:textbox id="text1" runat="server"/>×
<asp:textbox id="text2" runat="server"/>
<asp:button id="button1" text="=" onclick="button1_click"
runat="server"/>
<asp:label id="label1" runat="server"/><p>
</form>
<script language="vb" runat="server">
sub button1_click(sender as object, e as eventargs)
label1.text=cint(text1.text) * cint(text2.text)
end sub
</script>
</html>

我们会看到网页除了有我们所放的控件之外还多了一些信息,下表是trace 对象后各个标题的说
明:


trace 对象的常用属性如下表所示:

trace 对象的常用方法如下表所示:

下列范例利用trace 对象的warn 方法送出追踪讯息:
<%@page trace="true"%>
<html>
<form runat="server">
<asp:textbox id="text1" runat="server"/>×
<asp:textbox id="text2" runat="server"/>
<asp:button id="button1" text="=" onclick="button1_click"
runat="server"/>
<asp:label id="label1" runat="server"/><p>
</form>
<script language="vb" runat="server">
sub button1_click(sender as object, e as eventargs)
trace.warn("trace 讯息","click 事件开始")
trace.warn("text1 内容",text1.text)
trace.warn("text2 内容",text2.text)
label1.text=cint(text1.text)*cint(text2.text)
trace.warn("trace 讯息","click 事件结束")
end sub
</script>
</html>
上述范例我们在button1 的click 事件开始处加入
trace.warn("trace 讯息","click 事件开始") ,然后在事件结束位置加上
trace.warn("trace 讯息","click 事件结束") 。接着我们按下button1 后,发现在trace information 的区块中多了我们刚刚所自订的讯息。当我们不再需要trace 对象的讯息时,并不需要逐一的去删除;只要将<@page trace="true"> 从网页中移除,则trace 对象的信息将不会出现。而程序中的trace 叙述可以在以后使用,非常方便。