版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、VB.NET程序设计实用教程,第5章 程序调试和异常处理,本章任务,具有非结构化异常处理的简单计算器,具有结构化异常处理的简单计算器,本章主要内容,在VB .NET中使用调试工具调试 程序的方法,VB .NET的3种工作模式,VB .NET中的常用调试窗口,结构化异常处理语句(TryCatchFinallyEnd Try语句)的功能与使用,非结构化异常处理语句(On Error语句和Resume语句)的功能与使用,主要内容,5.1 程序的调试,程序中的错误可分为语法错误、逻辑错误或运行错误三种类型,系统会在语法错误的下面加上波浪线,比较容易查找和排除,而逻辑错误或运行错误排除则比较困难。当程序
2、中出现了逻辑错误或运行错误而又难以解决时,就应该借助于程序调试工具对程序进行调试。所谓程序调试就是在应用程序中查找并修改错误的过程。通过程序的调试,可以纠正程序中的错误。为了更正程序中发生的不同错误,VB .NET提供了多种调试工具,如设置断点、插入观察变量、逐行执行和过程跟踪、各种调试窗口等。,5.1.1 VB .NET的3种工作模式,5.1.1 VB .NET的3种工作模式,(1)设计模式 在设计模式下,用户可以设计项目。使用VB .NET 新建一个项后,系统将自动进入设计模式,此时,IDE的标题栏将显示“设计”字样。处于设计模式时,可进行应用程序的窗体设计、为窗体添加控件、设置对象属性、
3、编写程序代码等操作。在设计模式下可以为程序设置断点。,5.1.1 VB .NET的3种工作模式,(2)运行模式 项目设计完之后,运行项目,系统就进入了运行模式。此时,在IDE的标题栏上将显示“运行”字样。处于运行模式时,程序设计人员可以与程序交互、可以查阅程序代码,但不能修改程序代码。执行【调试】【停止调试】命令,或单击工具栏上的“停止调试”按钮图标“ ”就可以中止程序运行。,5.1.1 VB .NET的3种工作模式,(3)中断模式 当系统处于运行模式时,单击工具栏中的“全部中断”按钮“ ”,或执行【调试】【全部中断】命令,都将暂停程序的运行,进入中断模式。此时,在IDE的标题栏中将显示“中断
4、”字样。中断模式主要用于程序调试和排除错误,可以查看代码,也可编辑代码。同时,可以检查或修改数据。当想结束中断重新从中断处继续执行程序时,只需单击“继续”按钮“ ”即可。如果程序中设有断点或代码中含有Stop语句,则程序运行到断点或Stop语句处也将进入中断模式。,5.1.2 使用调试工具调试程序,为了方便用户对程序进行调试,VB .NET提供了一组调试工具。可通过“调试”菜单和 “调试”工具栏来调用这些调试工具,“调试”菜单如图5-1所示,“调试”工具栏如图5-2所示。当调试工具栏没有出现时,可执行【视图】【工具栏】【调试】使之出现。,5.1.2 使用调试工具调试程序,1设置和删除断点 断点
5、是应用程序暂时停止执行的位置,也是让应用程序进入中断模式的地方。在程序设计中,可以在中断模式和设计模式下设置和删除断点。在调试程序时,按照程序的功能,可在怀疑有错误的语句处设置断点,这样,有利于测试程序的功能和发现程序的逻辑错误。 设置断点的方法主要有以下几种: 在代码窗口中,单击要设置断点的那一行代码,然后按F9键; 在代码窗口中,在要设置断点的那一行代码行上,单击鼠标右键并选择“插入断点”命令; 在代码窗口中,在要设置断点的那一行代码行的左边界上的竖条上单击。,5.1.2 使用调试工具调试程序,被设置成断点的代码行显示为红色,并在其左边显示一个红点,如图5-3所示。若要删除一个断点,只需重
6、复上面步骤即可。,5.1.2 使用调试工具调试程序,2跟踪程序的执行 在VB .NET中,提供了“逐语句”、“逐过程”、“跳出”等好几种跟踪程序执行的方式。 逐语句执行:“逐语句”执行方式是一次执行一条语句,这种方式又称为单步执行。每执行一条语句之后,程序设计人员可以使用“即时”窗口、“局部变量”窗口或“巡视”窗口,来查看语句的执行结果,借此分析程序中存在的问题。 逐过程执行:“逐过程”执行与逐语句执行类似,差别在于当前语句如果包含过程调用,“逐语句”将进入被调用过程,而“逐过程”则把整个被调用过程当作一条语句来执行。 跳出:“跳出”命令是连续执行当前过程的剩余语句部分,并在调用该过程的下一个
7、语句行处中断执行。 以上三种命令均可以通过执行【调试】菜单中的相应菜单命令或单击【调试】工具栏上的相应按钮来实现。,5.1.3 常用的调试窗口,在调试应用程序时,经常要分析应用程序的程序段或语句的运行结果,并希望能够看到变量、属性、表达式等值的变化,以便找出错误所在处。为便于观察程序块或语句的运行结果,在VB .NET提供了很多调试窗口,充分利用这些窗口,可以提高程序调试的效率。下面将一一介绍主要调用窗口的功能。,5.1.3 常用的调试窗口,1 “命令”窗口 在VB .NET中,有一个“命令”窗口,在该窗口中可以直接使用VB .NET的各种命令与系统交互。“命令”窗口有两种不同的模式:命令模式
8、和立即模式。命令模式主要用来执行命令,立即模式主要用于调试程序。在调试应用程序执行函数或语句等操作时,可使用立即模式查看,并更改变量的值。通过执行【调试】【窗口】【即时】命令,可以以立即模式打开“命令” 窗口。当命令窗口处于立即模式时,标题栏显示“命令窗口一立 即”,如图5-4所示。,图5-4 “命令”窗口,5.1.3 常用的调试窗口,2“监视”窗口 利用“监视”窗口,可以动态观察变量、数组、数组元素和表达式的值,从而可以观察程序的运行情况,找到错误的所在。在“监视”观察的变量或表达式称为监视表达式。“监视”窗口只能在运行模式或中断模式下打开,打开方法是执行【调试】【窗口】【监视】命令,打开的
9、“监视”窗口如图5-5所示。若要在“监视”窗口中添加监视表达式,只需单击【监视】窗口“名称”列最下面单元格上单击,在其中输入监视表达式即可。“监视”窗口是最重要的调试用窗口之一,在逐语句运行的情况下,通过该窗口可以看到每执行一条语句后,监视表达式值的变化情况,从而可以找到错误所在,图5-5 “监视”窗口,5.1.3 常用的调试窗口,3 “局部变量”窗口 在“局部变量”窗口可以显示当前过程中所有局部变量的值。当程序从一个过程执行到另一个过程时,“局部变量”中显示的变量及其值也会随之改变,因为该窗口只显示当前正在执行的过程中所有局部变量的值。打开“局部变量”窗口的方法是执行【调试】【窗口】【局部变
10、量】命令,打开的“局部变量”窗口如图5-6所示。“局部变量”窗口只显示当前过程的“局部变量”的值,模块级变量和全局变量的值不会显示在该窗口中。 除了上述窗口外,还有“任务列表”窗口、 “输出”窗口、“Me”窗口等调试窗口。,图5-6 “局部变量”窗口,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,任务5-1描述: 制作一个简单计算器程序,程序的设计界面如图5-7所示。程序运行时通过按钮输入运算公式,如图5-8所示。单击“计算”按钮将得到计算结果,如图5-9所示。单击清除按钮将清除文本框中显示的表达式或运算结果。程序能够捕获并处理算术运算溢出的异常(被0除和运算数或运算
11、结果超出类型允许的范围)和运算数少的错误,分别如图5-10和图5-11所示。,图5-7 程序设计界面,图5-8 输入的公式,图5-9 单击“运算”得到的结果,图5-10 “算术运算溢出”异常处理,图5-11 “运算数缺少异常”处理,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,任务分析: 通过单击数字按钮输入公式时,只需在各数字按钮的Click事件中把按钮的Text属性值连接到文本框的Text属性中,这样每单击一次数字按钮,对应的数字将出现在文本框中。单击运算符按钮时,在文本框的Text属性中连接一个空格,然后连接运算符按钮的Text属性,再连接一个按钮。这样在“计算
12、”按钮的Click事件中,就可以通过查找空格的位置,通过字符串的取子串方法就可以获得两个运算数和运算符,然后通过Select CaseEnd Select语句可以判断运算符是什么运算符并对两个运算数进行相应运算就可以得到结果,把结果显示出来即可。为了捕获并处理异常,可使用On Error语句指定错误处理程序。在错误处理程序块中通过Err对象的Number属性中的错误号来判断错误的类型(算术运算溢出,错误号为6。过程参数错误,错误号为5),然后决定相应的处理。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,任务实现: 1启动VB.NET,新建一个项目,项目类型为“Win
13、dows应用程序”,项目的存放位置为“D:VBTASKCH05”,项目名为“Task5_1”。 2把Form1窗体的Text属性值设置为“简单计算器”,把它的Name属性值设置为“SimpleCalculator”。单击“解决方案资源管理器”中的“Form1.VB”窗体,然后在属性窗口中把它文件名属性设置为“SimpleCalculator.vb”。然后执行【项目】【Task5_1属性】命令,在出现的“Task5_1属性页”对话框中把“启动对象”设置为“SimpleCalculator”。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,3对照程序设计界面,为窗体添加控
14、件并设置控件的属性。控件的属性设置如表5-1所示。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,4编写Button1的Click事件过程代码,如下。 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = 清空文本框 End Sub 5编写Button2的Click事件过程代码,如下。 Private Sub Button2_Click(ByVal sender As Syst
15、em.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim btn As Button 按钮类型的变量 btn = sender 把产生该事件的按钮对象赋值给btn TextBox1.Text = TextBox1.Text + btn.Text 把该按钮的Text属性值连接到TextBox1中 End Sub,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,6运行程序,单击“1”按钮,发现每单击一次该按钮文本框中都将连接一个“1”,单击“清空”按钮,文本框中的内容将被清空。 7依次编写Button
16、3Button11各按钮的Click事件过程代码,并对各按钮的功能进行测试。各按钮的Click事件过程代码和Button2按钮的Click事件过程代码完成一样。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,8编写Button12按钮的Click事件过程代码,如下。 Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click Dim btn As Button btn = sender 在文本框的Text属性后
17、连接一个空格、本按钮的Text属性值和一个空格 TextBox1.Text = TextBox1.Text + + btn.Text + End Sub 说明: 连接两个空格的作用是把运算符和前后的两个运算数分隔开来,这样就可以通过字符串的Index方法找出空格的位置,然后再通过字符的Substring方法分离出两个运算数和运算符。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,9运行程序,通过单击数字按钮输入第一个运算数,单击“+”按钮输入“+”运算符号,再通过单击数字按钮输入第二个运算数,发现在两个运算数和“+”号之间均有一个空格。,5.2 任务5-1:具有非结构
18、化异常处理的简单计算 器非结构化异常处理,10依次编写Button13、Button14和Button15的Click事件过程代码,并对它们的功能进行验证。Button13、Button14和Button15的Click事件过程代码与Button12的Click事件过程代码完全一致。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,11编写“运算”按钮的Click事件过程代码如下。 Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
19、Button16.Click 发生错误转移到标号“ErrorPro”指定的行去执行错误处理程序 On Error GoTo ErrorPro Dim r As Decimal 保存计算结果的变量 Dim t As String = TextBox1.Text 用于保存文本框中的算术表达式 Dim space As Integer = t.IndexOf( ) 搜索空格位置,如果没有空格,返回值为0 字符串的取子符方法,第二个参数小于0,则将产生错误号为5的异常,即过程参数不正确 Dim s1 As String = t.Substring(0, space) 通过取子串方法获得第一个运算数 D
20、im op As String = t.Substring(space + 1, 1) 通过取子串方法获得运算符 Dim s2 As String = t.Substring(space + 3) 通过取子串方法获得第二个运算数 Dim arg1, arg2 As Integer arg1 = Val(s1) : arg2 = Val(s2) Select Case op Case + : r = arg1 + arg2 Case - : r = arg1 - arg2 Case * : r = arg1 * arg2 Case / : r = arg1 / arg2 Case Else,5.
21、2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,MsgBox(输入的运算符有误!) Exit Sub End Select TextBox1.Text = CStr(r) 显示结果 Exit Sub 退出过程 ErrorPro: 错误处理程序块 Select Case Err.Number Case 6 除数为零时,或运算溢出时的错误号 MsgBox(算术运算溢出!, , 溢出提示) TextBox1.Focus() Exit Sub Case 5 Substring过程的参数不符合要求的错误号 MsgBox(必须输入运算符和第二个运算数!, , 运算数少) Exit Su
22、b Case Else 其它情况显示错误号和错误原因 MsgBox(错误号为 & Err.Number & Chr(10) & Chr(13) & 错误原因: & Err.Description) Exit Sub End Select End Sub,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,说明: (1)程序中的“t.IndexOf( )”的作用是在字符串变量t的值中查找空格第一次出现的位置,若找到则以整数形式返回空格所在位置(第一个字符的位置为0),若找不到则返回-1。IndexOf是字符串的一个方法,其作用是在字符串中查找子符的位置,查找到则返回位置值,查
23、找不到返回-1。 (2)程序中“t.Substring(0, space)”的作用是从变量t存放的字符串的第一个字符开始取space个字符作为字串返回。Substring也是字符串的一个方法,其作用是取子串,基本格式有两种,分别如下。 格式1:str.Substring(start,length) 作用:从“str”指定的字符串的第“start”个字符开始,取“length”个字符作为子串返回。参数start代表要取的子串的开始位置,length代表要取的子串的长度,值均应大于等于0。 格式2:str.Substring(start) 作用:从“str”指定的字符串的第“start”个字符开始
24、,一直取到字符串的结尾作为子串返回。 (3)程序中的语句“On Error GoTo ErrorPro”是一条非结构化的错误捕获语句,用来捕获程序中的错误。在非结构化异常处理中,将On Error语句放在代码块的开始处,它将处理在该块内发生的任何错误。如果在执行On Error语句后过程中引发了异常,程序流程将跳转到On Error语句中指定的行参数。行参数(行号或行标签)指示异常处理程序的位置。 有时,在某过程中调用了另一个过程,并且在被调用过程中发生异常。这种情况下,如果被调用过程不处理异常,则异常传播回调用过程,并且程序流程将跳转到On Error语句中指定的行参数。,5.2 任务5-1
25、:具有非结构化异常处理的简单计算 器非结构化异常处理,On Error语句有以下四种形式: On Error GoTo Line On Error Resume Next On Error GoTo 0 On Erro GoTo -1,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理, On Error GoTo Line 该语句假定错误处理代码在Line参数指定的行处开始。该语句的作用是如果发生运行时错误,则将流程跳转到该Line参数中指定的行号和行标签,并激活错误处理程序。指定行必须与 On Error GoTo Line 语句位于同一过程中,否则 Visual Ba
26、sic 将生成编译器错误。请看下面的示例: Sub ErrTest On Error GoTo ErrorHandler 可能包含错误的代码 Exit Sub ErrorHandler: 用于处理错误的代码 Resume End Sub,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理, On Error GoTo Line 该语句假定错误处理代码在Line参数指定的行处开始。该语句的作用是如果发生运行时错误,则将流程跳转到该Line参数中指定的行号和行标签,并激活错误处理程序。指定行必须与 On Error GoTo Line 语句位于同一过程中,否则 Visual B
27、asic 将生成编译器错误。请看下面的示例: Sub ErrTest On Error GoTo ErrorHandler 可能包含错误的代码 Exit Sub ErrorHandler: 用于处理错误的代码 Resume End Sub 本例包含一个名为 ErrorHandler 的错误处理程序。如果ErrTest过程中的任何代码生成错误,VB .NET将立即执行 ErrorHandler 标签后面的代码。在错误处理程序块的结尾处,Resume 语句将把程序流程转移到最先发生错误的代码行,重新执行发生错误的代码行及以后的代码。 需注意的是,必须将 Exit Sub 语句放在错误处理块的前面,
28、否则,VB .NET在到达子例程的结尾时将运行错误处理代码,从而导致不可意料的结果。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理, On Error Resume Next 该语句的作用是如果在过程中出现运行错误,将把流程跳到发生错误的语句的下一条语句,再继续进行。使用该语句可以将错误处理过程放置于错误可能发生的地方,从而不需要在发生错误时将程序流程跳转到其他位置。 如果在过程中调用了其他过程,则On Error Resume Next语句将在执行被调用的过程时被禁止。因此,应该将On Error Resume Next语句放置于每个被调用的过程中。,5.2 任务5
29、-1:具有非结构化异常处理的简单计算 器非结构化异常处理, On Error GoTo 0 该语句用于禁止当前过程中任何可用的错误处理代码块。如果不包含On Error Go To 0语句,则当退出过程时,其中的所有异常处理代码块都将被自动禁止。 On Error GoTo 0语句并不表示第0行是错误处理代码的起始,即使过程中包含第0行。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理, On Error GoTo -1语句 该语句用来禁止当前过程中任何可用的异常。如果不包含On Error GoTo -1语句,则当退出它的过程时,异常将被自动禁止。与On Error
30、GoTo 0语句类似,该语句也并不表示第-1行是错误处理代码的起始,即使过程中包含第-1行。 下面通过一个实际的例子来说明On Error语句的使用。例子的作用是把异常处理程序命名为DivideByZero并处理除数为0的错误。如果发生不同的错误,VB .NET引发运行时错误并停止应用程序。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,示例代码如下: Sub ErrorTestExam () Dim m As Integer, m As Integer, k As Integer On Error GoTo DivideByZero 捕获错误,异常处理程序被命名为D
31、ivideByZero. 下面是代码的主体部分,可能产生错误 m = 6 : n = 0 k = m n On Error GoTo 0禁止异常处理 Console.WriteLine(m & / & n & = & k) 在执行错误代码之前应退出过程,如果该操作失败将产生意想不到的结果 Exit Sub 异常处理程序 DivideByZero: Console.WriteLine(You have attempted to divide by zero!) 输出错误提示信息 n = 1 处理错误的代码 Resume 该语句将返回到首次发生错误的语句重新执行,应用程序可以继续执行下去 End
32、Sub 注意:使用 On Error 的非结构化错误处理会降低应用程序性能并导致代码难以调试和维护。建议使用结构化错误处理方法。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,(4)在“ErrorPro”行号指定的错误处理程序块中,通过Select CaseEnd Select语句测试错误号,然后决定相应的操作。错误号通过Err对象的Number属性值取得。Err对象包含与运行时错误相关的信息,在错误处理代码中通用对Err对象属性值的检测可以知道发生的错误。 Err对象的属性值由刚发生的错误决定,Err对象的主要属性有: Number属性:该属性包含了错误代码,即导致
33、错误的原因。 Description属性:该属性包含了发生的错误的描述信息,是一个字符串属性。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,Err对象的常用方法有Raise和Clear,其格式与功能如下: Raise方法 格式:Public Sub Raise( ByVal Number As Integer, Optional ByVal Source As Object = Nothing, Optional ByVal Description As Object = Nothing, Optional ByVal HelpFile As Object = No
34、thing, Optional ByVal HelpContext As Object = Nothing ) 功能:产生一个错误。 说明:参数Number 为必选参数,是用于标识错误的特性的 Long 型数据。Visual Basic 错误范围在065535 内:范围 0512 保留用于系统错误,范围 51365535 则用于用户定义的错误。当在类模块中将 Number 属性设置为您自己的错误代码时,向 vbObjectError 常数添加您的错误代码号。例如,若要生成错误号 513,应分配 vbObjectError + 513 给 Number 属性。参数Source是一个可选参数,用来
35、命名生成错误的对象或应用程序的 String 表达式。参数Description也是一个可选参数,是用来设定描述错误的信息,是一个字符串型表达式。例如,下列的程序代码是生成一个代号为513的用户定义的错误: Err.Raise(vbObjectError + 513, SimpleCalCulator,本运算器现在不能用!),5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,Clear方法:该方法用来清除Err对象的所有属性值。 任何错误处理程序都应该在其它错误发生之前,测试或保存Err对象的相关属性值。在错误处理例程中的 Exit Sub、Exit Function、E
36、xit Property 或 Resume Next 语句执行之后,Err 对象的属性重置为零或零长度字符串 ()。在错误处理例程以外,使用任何形式的 Resume 语句都不会重置 Err 对象的属性。但可使用 Clear 方法显式地重置 Err。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,12运行程序,输入第一个运算数,输入“/”运算,再输入“0”,单击运算按钮,将出现算术运算溢出异常,如图5-10所示。只输入第一个运算数,直接单击“运算”按钮,将会出现过程参数不正确异常,如图5-11所示。 13保存项目,至此本任务全部完成。,5.2 任务5-1:具有非结构化异
37、常处理的简单计算 器非结构化异常处理,归纳说明: 异常处理是程序员在编写过程中必须要考虑的一件事,好的异常处理能使程序具有较强的容错能力和纠错能力。本任务通过计算器运算过程中容易出现的一些异常的解决方法,讲解了非结构化异常处理的一般方法:在容易发生异常的程序段前使用On Error语句指定错误处理程序块,在错误处理程序块中对出现的异常进行处理。在错误处理程序块中通过需要测试Err对象的Number属性以获取错误的类型,从而实施相应的处理。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,拓展与提高: 错误处理程序块完成之后想要使程序继续执行,可使用Resume语句,该语
38、句的形式主要有三种,下面分别加以讲述。 (1)Resume 0 如果错误发生在错误处理程序所在的同一过程中,在错误处理程序中执行到该语句时,程序将由产生错误的语句处继续执行。如果错误发生在被调用的过程中,在错误处理程序中执行到该语句时,程序将从最近过程(该过程含有错误处理例程)调用的语句处继续执行。参数0可以缺省。 (2)Resume Next 如果错误发生在错误处理程序所在的同一过程中,在错误处理程序中执行到该语句时,程序将从引发错误的语句的下一条语句处继续执行。如果错误发生在被调用的过程中,在错误处理程序中执行到该语句时,程序将从过程(该过程含有错误处理例程)调用的语句的下一条语句继续执行
39、。 (3)Resume line 在错误处理程序中执行到该语句时,程序将从必选参数line指定的代码行处继续执行。line参数是一个行标签或者行号,必须位于错误处理程序所在的同一过程中。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,使用该语句有以下两点需注意: (1)在错误处理程序中,还可以通过Exit Sub、Exit Function、Exit Property等语句退出发生错误的过程。 (2)如果在错误处理例程以外的任何位置使用Resume语句,将会引发错误。Resume语句不能用在含有Try-Catch-Finally语句的过程中。 下面看一个Rsume语句
40、的使用示例,该示例的作用是使用 Resume 语句来结束过程中的错误处理,然后继续执行导致错误的语句。,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,示例代码如下: Sub ResumeStatementDemo() On Error GoTo ErrorHandler 激活错误处理程序 Dim m As Integer = 68 Dim n As Integer = 0 Dim k As Integer k = m n 产生被0除的异常 Exit Sub 退出过程 ErrorHandler: 程序处理程序 Select Case Err.Number 测试错误号 C
41、ase 6 处理被0除的错误 n = 1 设置y的值为1,以便重新除 Case Else 此处放置处理其它错误的代码 End Select Resume 返回到发生错误的语句执行 End Sub,5.2 任务5-1:具有非结构化异常处理的简单计算 器非结构化异常处理,思考与实训: 1为什么要进行异常处理? 2非结构化异常处理的一般模式是什么? 3Err对象的Number属性和Description属性各有什么作用? 4编写一个除法计算器,用非结构化异常处理方法除数为0的异常和所有其它异常。当除数为零时,自动把除数设置为1,给出结果不可靠的信息并重新执行除法运算得到不可靠的结果,如图5-12所示
42、。如果发生了其它异常则给出异常的提示信息,并退出过程,如图5-13所示。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,异常处理: 任务5-2描述: 在任务5-1的基础上增加对过程(调用的字符串的有关方法)参数格式不正确的异常捕获与处理,捕获该异常时的程序运行界面如图5-14所示。要求使用结构化异常处理。,图5-14 参数格式不正确时的异常捕获与处理,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,任务分析: 基本同任务5-1,只是处理异常的时候使用结构化异常处理语句TryCatchFinallyEnd Try语句。捕获的算术溢出异常为System.Ove
43、rflowException,捕获的参数不正确异常为System.ArgumentException,捕获的参数格式不正确异常为System.FormatException。 任务实现: 110与任务5-1的110步骤完成相同。 11编写“计算”按钮的Click事件过程代码 。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,任务实现: 110与任务5-1的110步骤完成相同。 11编写“计算”按钮的Click事件过程代码,如下。 Private Sub Button16_Click(ByVal sender As System.Object, ByVal e As Syst
44、em.EventArgs) Handles Button16.Click Dim r As Decimal 保存计算结果 Dim t As String = TextBox1.Text 用于保存文本框中的算术表达式 Try Dim space As Integer = t.IndexOf( ) 搜索空格位置 字符串的取子符方法,第二个参数小于0,则将产生错误号为5的异常 Dim s1 As String = t.Substring(0, space) Dim op As String = t.Substring(space + 1, 1) 用于保存运算符 Dim s2 As String =
45、t.Substring(space + 3) Dim arg1, arg2 As Integer 整数运算可能会超出范围 arg1 = Convert.ToInt32(s1) : arg2 = Convert.ToInt32(s2) Select Case op,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,Case + : r = arg1 + arg2 Case - : r = arg1 - arg2 Case * : r = arg1 * arg2 Case / : r = arg1 / arg2 Case Else MsgBox(输入的运算符有误!) MsgBox(
46、输入的运算符有误!) Exit Sub End Select TextBox1.Text = CStr(r) Exit Sub 退出过程 Catch Exam As System.OverflowException 算术溢出异常处理 MsgBox(算术运算溢出!, , 溢出提示) Catch Exam As System.ArgumentException 参数数目不够或值不在范围内异常处理,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,MsgBox(参数有误,应输入运算符和第二个运算数!, , 参数有误提示) Catch Exam As System.FormatExce
47、ption 参数格式不正确异常处理 MsgBox(字符串中出现了非数字字符, , 参数格式不正确提示) Catch Exam As System.Exception 其它异常处理 MsgBox(其它异常,错误号为: & Err.Number & Chr(10) & Chr(13) & 错误提示: & Err.Description) End Try End Sub,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,说明: (1)程序中的语句“TryCatchFinallyEnd Try”是专门用于结构化异常处理的语句。结构化异常处理能帮助程序员创建和维护具有可靠、全面的错误处理
48、程序的项目。在结构化异常处理中,代码块是封装的,每个块有一个或几个关联的处理程序。每个处理程序对它处理的异常类型指定某种形式的筛选条件。当受保护的代码块内的代码引发异常时,按顺序搜索相应的处理程序集,并执行第一个与筛选条件匹配的处理程序。 (2)“TryCatchFinallyEnd Try”语句用于处理给定代码段中可能出现的某些或所有错误,而同时代码仍保持运行。该语句的格式与功能如下。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,格式:Try Try语句块 该语句块可能会引发异常 Catch exception As type When expression 用于捕获T
49、ry语句块中的异常 Catch语句块Catch语句块用来对捕获的错误进行处理 Finally finally语句块 Finally语句块,存放异常处理后执行的代码 End Try 功能:执行“Try语句块”中的语句,如果产生异常,则系统自动查找离可以处理这个异常的语句最近的Catch语句,并且在运行时决定异常类型。首先,会寻找包含此代码的Try块。当找到Try块时,系统将从与此Try块相关联的一个或多个Catch块中,寻找一个符合条件的块执行。这个查找一直进行直到找到可以处理当前的异常的Catch块为止。找到异常处理块后,将执行其中的处理代码,在处理代码中进行异常处理或重新抛出异常。无论是否有
50、异常发生,均会执行Finally块中的“语句组n+1”。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,说明: “exception As type ”用来指定捕获指定类型或其派生类型的异常。例如,若此项为“Ex As DivideByZeroException”,则在执行Try块时发生了整除除数为0的异常,将执行该Catch语句块。 “When expression”用来指定执行该Catch语句块必须要满足的条件,通常要根据Err对象中的某些信息来构成表达式。例如,若此项为“Where Err.Number=6”,则在执行Try块时发生了数据溢出异常,将执行该Catch语
51、句块。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,执行Try语句块发生异常时,将从第一个Catch块开始寻找匹配的异常,找到第一个匹配的异常时,执行其中的Catch语句块。执行过后,如果有Finally语句块则执行该语句块,如果无该语句块则跳出Try语句。 可以省略Catch块。由于没有Catch块,程序执行过程中发生异常,如果有Finally块则将直接执行该块中的代码,否则将直接中断。 Finally块也可以省略。但Catch块和Finally块不能同时省略。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,3)上述代码的Catch语句中的“Syst
52、em.OverflowException”、“System.ArgumentException”、“System.FormatException”和“System.Exception”均是VB .NET提供的异常类名。在VB .NET中,所有的异常都派生于System.Exception类,该类包含在公共语言运行库中。该类有两个重要的属性。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,如下: Message属性:该属性是只读属性,包含对异常原因的描述信息。 InnerException属性:该属性也是一个只读属性,它包含这个异常的“内部异常”。如果它不是Null,就指出当
53、前的异常是作为对另外一个异常的回答而被抛出。产生当前异常的异常可以在InnerException属性中得到。上述两个属性可以在System.Exception构造函数中赋值,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,。,为了对异常进行更细致的划分,VB .NET还提供了一些通用异常类,常用的通用异常类及其继承关系如图5-15所示。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,各种异常类代表的含义如下: Exception类:应用程序执行期间发生任何错误时,均会产生该类异常。 SystemException类:该类是为System命名空间中的预定义异
54、常定义的基类。 ArithmeticException类:该类代表因算术运算、类型转换或转换操作中的错误而引发的异常。 DivideByZeroException类:该类代表试图用零除整数值或Decimal数值时引发的异常。 OverflowException类:该类代表进行算术运算、类型转换或转换操作导致溢出时引发的异常。 NotFiniteNumberException类:该类代表当浮点值为正无穷大、负无穷大或非数字 (NaN)时引发的异常。 ArrayTypeMismatchException类:该类代表当试图在数组中存储类型不正确的元素时引发的异常。 ArgumentException
55、类:该类代表当向过程提供参数时,其中一个或多个无效时引发的异常。,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,ArgumentNullException类:该类代表当将空引用(在 Visual Basic 中为 Nothing)传递给不接受它作为有效参数的方法时引发的异常。 ArgumentOutOfRangeException类:该类代表当参数值超出调用的过程所定义的允许取值范围时引发的异常。 FormatException类:该类代表当参数格式不符合调用过程的参数规范时引发的异常。 IndexOutOfRangeException类:该类表示试图访问下标超出数组界限的
56、数组元素时引发的异常。 NotSupportedException类:该类表示当调用的过程不受支持,或试图读取、查找或写入不支持调用功能的流时引发的异常。 NullReferenceException类:该类代表尝试取消引用空对象的引用时引发的异常。 OutOfMemoryException类:该类代表没有足够的内存继续执行程序时引发的异常。 StackOverflowException类:该类代表挂起的过程调用过多而导致执行堆栈溢出时引发的异常。 阿,5.3 任务5-2:具有结构化异常处理的简单计算器结构化异常处理,(4)一般在处理异常时,使用若干个Catch块把感兴趣的异常处理完,再用一个Catch块,处理剩余的其它异常,此时Catch块中的变量应是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年南昌健康职业技术学院单招职业适应性测试题库附参考答案详解(综合卷)
- 2026年内蒙古北方职业技术学院单招职业倾向性测试题库附答案详解(精练)
- 2026年内江职业技术学院单招职业技能测试题库含答案详解ab卷
- 2026年内蒙古建筑职业技术学院单招职业适应性考试题库及一套完整答案详解
- 2026年共青科技职业学院单招职业倾向性测试题库带答案详解(满分必刷)
- 2026年南京信息职业技术学院单招职业倾向性测试题库附参考答案详解(突破训练)
- 2026年厦门华厦学院单招职业适应性考试题库附参考答案详解(综合卷)
- 2026年内蒙古体育职业学院单招职业技能测试题库附参考答案详解(巩固)
- 2026年厦门兴才职业技术学院单招职业适应性考试题库带答案详解(新)
- 2026年厦门东海职业技术学院单招综合素质考试题库带答案详解(基础题)
- 2026年张家界航空工业职业技术学院单招职业技能考试备考题库含详细答案解析
- 2026年智能手环技术分析报告
- 2026年春季苏教版(2024)三年级下册数学教学计划附教学进度表
- 2026年及未来5年中国接触器市场供需格局及未来发展趋势报告
- 车辆特情处置课件
- 恶性肿瘤高钙血症
- 公司技术部负责人安全生产目标责任书
- 电子商务专业试讲教案
- 中小企业数字化转型城市试点实施指南
- 2025秋八年级上学期历史早背晚默练习资料(含答案)
- 国家生物安全培训课件
评论
0/150
提交评论