我們在開發程序的時候難免會發生錯誤,這些錯誤有時是程序設計師在編寫程序代碼時不小心打錯,有時是客戶端使用者因操作不當而引發的;即使再小心的程序設計師也不可能完全避免程序出錯。因此如何避免錯誤、找出錯誤便成了程序設計中不可缺少的一環。程序的錯誤大致可分為三種,分別為語法錯誤、執行時期錯誤,以及邏輯錯誤。
語法錯誤(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 功能
在對程序進行除錯工作的同時,都希望能夠有系統的整理這些除錯訊息??墒且酝木W頁程序設計并不提供這樣的功能,必須使用一堆如Response.Write() 方法來顯示所需要信息,既不清楚又沒有效率?,F在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>