错误处理程序

发表于:2007-07-14来源:作者:点击数: 标签:
前面所提的Trace 的确是很方便,不过它只能针对程序 开发 时或维护时使用。而在执行程序时常因为使用者操作错误或程序写作不周详,而发生发生执行时期错误(Runtime Error)。此时如果让使用者的浏览器显示错误的讯息,那么对于网站的形象就会造成负面的影响


    前面所提的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>



    当Text1 及Text2 中都输入数值则显示正常的结果,但如果其中任一个TextBox 输入非数值型态的数据便引发一个错误;此时程序会跳到ErrHandler 卷标处执行错误处理法则。而非数字型态的值做型态转换会引发代码为13 的错误,所以我们可以使用If 叙述判断,当Err 对象的Number属性为13 时,Label2 将会显示「两边都必须输入数值」,接着回到发生错误的下一行继续执行。

Tips
    关于错误码以及其错误的讯息,如果你有MSDN(Microsoft Developer Network) Library 光盘,可以查询其中的「Trappable Errors」议题,或是浏览微软MSDN 的官方网站「Http://msdn.microsoft.com/library/default.asp 」在线查询,或是执行ErrCode.aspx 范例程序可以列出错误码以及错误描述。


MSDN Online Library

    
错误码以及错误描述

原文转自:http://www.ltesting.net