前面所提的Trace 的確是很方便,不過它只能針對程序開發時或維護時使用。而在執行程序時常因為使用者操作錯誤或程序寫作不周詳,而發生發生執行時期錯誤(Runtime Error)。此時如果讓使用者的瀏覽器顯示錯誤的訊息,那么對于網站的形象就會造成負面的影響。所以網頁開發時我們必須假設所有使用者會發生的錯誤,并且撰寫程序來處理這些錯誤;這個處理錯誤的程序稱為「錯誤處理法則」。VB.NET 支持了兩種錯誤處理法則,一個是從以前的VB 就支持的On ErrorGoto 敘述,另一個是全新的Try...Catch 敘述。這兩種比較起來以Try...Catch 較結構化,但是On Error Goto 的使用較為簡單,兩者各有利弊。
On Error Goto 敘述
OnError 錯誤處理法則大約分為三個步驟:
1. 開啟錯誤捕捉碼,指定錯誤發生時應該執行哪些程序代碼。
2. 撰寫修正錯誤的程序。
3. 結束錯誤處理繼續執行正常的程序。
在介紹On Error Goto 敘述之前我們先了解Err 對象。當程序發生錯誤時,所有和錯誤相關的訊息都會被紀錄在這個對象里;我們能利用Err 對象來檢視目前發生錯誤的錯誤訊息、錯誤代碼及簡述,或是用來引發一個自訂的錯誤。Err 對象的屬性如下所示:
Err 對象的方法如下所示:
致能錯誤捕捉
接著我們要介紹如何建立錯誤處理法則。首先我們在程序的開始處輸入「On Error Goto 標注」來致能錯誤捕捉的功能,并指定程序發生錯誤時程序代碼要轉移的錯誤處理法則。下列程序代碼片段將錯誤捕捉打開,并指定程序發生錯誤時會跳到標簽「ErrHandler」來執行錯誤處理法則:
Sub 程序名稱(Sender As Object, e As EventArgs)
On Error Goto ErrHandler
...
Exit Sub
ErrHandler:
錯誤處理碼...
...
跳出錯誤處理法則
End Sub
上述程序代碼片段中,我們輸入敘述OnError Goto...開啟錯誤捕捉,并指定發生錯誤時跳至ErrHandler 標簽處執行錯誤處理法則;卷標的宣告只要在卷標名后加上冒號「:」即可。我們在程序的最后面的地址將錯誤處理法則加入,并且在錯誤處理法則標號前加Exit Sub 敘述;這是因為程序是逐行執行的,倘若沒有發生任何錯誤還是會跳入錯誤處理法則執行錯誤處理的工作。所以我們在錯誤處理法則標號前加入Exit Sub 敘述,以避免沒有發生錯誤時跳入錯誤處理法則中執行錯誤處理碼;如果我們執行的程序是Function 程序時,在錯誤處理法則前要加入的 敘述為Exit Function 。
跳出錯誤處理法則
在錯誤處理法則中程序的執行遇到End Sub 或End Function 敘述時便結束程序的執行。若我們要讓程序回到程序中繼續執行,則要使用Resume 敘述。Resume 敘述的使用有三種方式,如下表所示:
在ASP.NET 中使用第一種Resume 時要特別注意,這種Resume 敘述最主要用在一般的Windows 應用程序上,倘若在ASP.NET 中使用Resume 敘述會導致無窮循環。因為ASP.NET回到錯誤的那一行后會將原本發生錯誤的程序代碼再執行一次,接著又進入錯誤處理程序,如此反復進行下去成為無窮循環。下列范例我們建立一個具有完整錯誤處理法則的網頁:
<Html>
<Form Runat="Server">
<ASP:TextBox Id="Text1" Runat="Server"/>X
<ASP:TextBox Id="Text2" Runat="Server"/>
<ASP:Button Id="Button1" Text="=" OnClick="Button1_Click"
Runat="Server"/>
<ASP:Label Id="Label1" Runat="Server"/><p>
<ASP:Label Id="Label2" Runat="Server"/>
</Form>
<Script Language="VB" Runat="Server">
Sub Page_Load(Sender As Object,e As Eventargs)
Label1.Text=""
Label2.Text=""
End Sub
Sub Button1_Click(Sender As Object,e As EventArgs)
On Error Goto ErrHandler '將錯誤捕捉打開
Label1.Text=Cint(Text1.Text)/Cint(Text2.Text)
Exit Sub
ErrHandler:
If Err.Number=13 Then '如果發生錯誤碼為13
Label2.Text=Err.Description & "<br>兩邊都必須輸入數字!"
Resume Next '回到發生錯誤行的下一行
End If
End Sub
</Script>
</Html>