VB.NET清华大学出版社VB.NET程序设计实用教程第5章程序调试和异常处理本章任务•具有非结构化异常处理的简单计算器•具有结构化异常处理的简单计算器本章主要内容在VB.NET中使用调试工具调试程序的方法VB.NET的3种工作模式VB.NET中的常用调试窗口结构化异常处理语句(Try…Catch…Finally…EndTry语句)的功能与使用非结构化异常处理语句(OnError语句和Resume语句)的功能与使用主要内容5.1程序的调试程序中的错误可分为语法错误、逻辑错误或运行错误三种类型,系统会在语法错误的下面加上波浪线,比较容易查找和排除,而逻辑错误或运行错误排除则比较困难。当程序中出现了逻辑错误或运行错误而又难以解决时,就应该借助于程序调试工具对程序进行调试。所谓程序调试就是在应用程序中查找并修改错误的过程。通过程序的调试,可以纠正程序中的错误。为了更正程序中发生的不同错误,VB.NET提供了多种调试工具,如设置断点、插入观察变量、逐行执行和过程跟踪、各种调试窗口等。5.1.1VB.NET的3种工作模式11设计模式12运行模式13中断模式5.1.1VB.NET的3种工作模式(1)设计模式在设计模式下,用户可以设计项目。使用VB.NET新建一个项后,系统将自动进入设计模式,此时,IDE的标题栏将显示“[设计]”字样。处于设计模式时,可进行应用程序的窗体设计、为窗体添加控件、设置对象属性、编写程序代码等操作。在设计模式下可以为程序设置断点。5.1.1VB.NET的3种工作模式(2)运行模式项目设计完之后,运行项目,系统就进入了运行模式。此时,在IDE的标题栏上将显示“[运行]”字样。处于运行模式时,程序设计人员可以与程序交互、可以查阅程序代码,但不能修改程序代码。执行【调试】→【停止调试】命令,或单击工具栏上的“停止调试”按钮图标“”就可以中止程序运行。5.1.1VB.NET的3种工作模式(3)中断模式当系统处于运行模式时,单击工具栏中的“全部中断”按钮“”,或执行【调试】→【全部中断】命令,都将暂停程序的运行,进入中断模式。此时,在IDE的标题栏中将显示“[中断]”字样。中断模式主要用于程序调试和排除错误,可以查看代码,也可编辑代码。同时,可以检查或修改数据。当想结束中断重新从中断处继续执行程序时,只需单击“继续”按钮“”即可。如果程序中设有断点或代码中含有Stop语句,则程序运行到断点或Stop语句处也将进入中断模式。5.1.2使用调试工具调试程序为了方便用户对程序进行调试,VB.NET提供了一组调试工具。可通过“调试”菜单和“调试”工具栏来调用这些调试工具,“调试”菜单如图5-1所示,“调试”工具栏如图5-2所示。当调试工具栏没有出现时,可执行【视图】→【工具栏】→【调试】使之出现。5.1.2使用调试工具调试程序1.设置和删除断点断点是应用程序暂时停止执行的位置,也是让应用程序进入中断模式的地方。在程序设计中,可以在中断模式和设计模式下设置和删除断点。在调试程序时,按照程序的功能,可在怀疑有错误的语句处设置断点,这样,有利于测试程序的功能和发现程序的逻辑错误。设置断点的方法主要有以下几种:①在代码窗口中,单击要设置断点的那一行代码,然后按F9键;②在代码窗口中,在要设置断点的那一行代码行上,单击鼠标右键并选择“插入断点”命令;③在代码窗口中,在要设置断点的那一行代码行的左边界上的竖条上单击。5.1.2使用调试工具调试程序被设置成断点的代码行显示为红色,并在其左边显示一个红点,如图5-3所示。若要删除一个断点,只需重复上面步骤即可。5.1.2使用调试工具调试程序2.跟踪程序的执行在VB.NET中,提供了“逐语句”、“逐过程”、“跳出”等好几种跟踪程序执行的方式。①逐语句执行:“逐语句”执行方式是一次执行一条语句,这种方式又称为单步执行。每执行一条语句之后,程序设计人员可以使用“即时”窗口、“局部变量”窗口或“巡视”窗口,来查看语句的执行结果,借此分析程序中存在的问题。②逐过程执行:“逐过程”执行与逐语句执行类似,差别在于当前语句如果包含过程调用,“逐语句”将进入被调用过程,而“逐过程”则把整个被调用过程当作一条语句来执行。③跳出:“跳出”命令是连续执行当前过程的剩余语句部分,并在调用该过程的下一个语句行处中断执行。以上三种命令均可以通过执行【调试】菜单中的相应菜单命令或单击【调试】工具栏上的相应按钮来实现。5.1.3常用的调试窗口在调试应用程序时,经常要分析应用程序的程序段或语句的运行结果,并希望能够看到变量、属性、表达式等值的变化,以便找出错误所在处。为便于观察程序块或语句的运行结果,在VB.NET提供了很多调试窗口,充分利用这些窗口,可以提高程序调试的效率。下面将一一介绍主要调用窗口的功能。5.1.3常用的调试窗口1.“命令”窗口在VB.NET中,有一个“命令”窗口,在该窗口中可以直接使用VB.NET的各种命令与系统交互。“命令”窗口有两种不同的模式:命令模式和立即模式。命令模式主要用来执行命令,立即模式主要用于调试程序。在调试应用程序执行函数或语句等操作时,可使用立即模式查看,并更改变量的值。通过执行【调试】→【窗口】→【即时】命令,可以以立即模式打开“命令”窗口。当命令窗口处于立即模式时,标题栏显示“命令窗口一立即”,如图5-4所示。图5-4“命令”窗口5.1.3常用的调试窗口2.“监视”窗口利用“监视”窗口,可以动态观察变量、数组、数组元素和表达式的值,从而可以观察程序的运行情况,找到错误的所在。在“监视”观察的变量或表达式称为监视表达式。“监视”窗口只能在运行模式或中断模式下打开,打开方法是执行【调试】→【窗口】→【监视】命令,打开的“监视”窗口如图5-5所示。若要在“监视”窗口中添加监视表达式,只需单击【监视】窗口“名称”列最下面单元格上单击,在其中输入监视表达式即可。“监视”窗口是最重要的调试用窗口之一,在逐语句运行的情况下,通过该窗口可以看到每执行一条语句后,监视表达式值的变化情况,从而可以找到错误所在图5-5“监视”窗口5.1.3常用的调试窗口3.“局部变量”窗口在“局部变量”窗口可以显示当前过程中所有局部变量的值。当程序从一个过程执行到另一个过程时,“局部变量”中显示的变量及其值也会随之改变,因为该窗口只显示当前正在执行的过程中所有局部变量的值。打开“局部变量”窗口的方法是执行【调试】→【窗口】→【局部变量】命令,打开的“局部变量”窗口如图5-6所示。“局部变量”窗口只显示当前过程的“局部变量”的值,模块级变量和全局变量的值不会显示在该窗口中。除了上述窗口外,还有“任务列表”窗口、“输出”窗口、“Me”窗口等调试窗口。图5-6“局部变量”窗口5.2任务5-1:具有非结构化异常处理的简单计算器——非结构化异常处理任务5-1描述:制作一个简单计算器程序,程序的设计界面如图5-7所示。程序运行时通过按钮输入运算公式,如图5-8所示。单击“计算”按钮将得到计算结果,如图5-9所示。单击清除按钮将清除文本框中显示的表达式或运算结果。程序能够捕获并处理算术运算溢出的异常(被0除和运算数或运算结果超出类型允许的范围)和运算数少的错误,分别如图5-10和图5-11所示。图5-7程序设计界面图5-8输入的公式图5-9单击“运算”得到的结果图5-10“算术运算溢出”异常处理图5-11“运算数缺少异常”处理5.2任务5-1:具有非结构化异常处理的简单计算器——非结构化异常处理任务分析:通过单击数字按钮输入公式时,只需在各数字按钮的Click事件中把按钮的Text属性值连接到文本框的Text属性中,这样每单击一次数字按钮,对应的数字将出现在文本框中。单击运算符按钮时,在文本框的Text属性中连接一个空格,然后连接运算符按钮的Text属性,再连接一个按钮。这样在“计算”按钮的Click事件中,就可以通过查找空格的位置,通过字符串的取子串方法就可以获得两个运算数和运算符,然后通过SelectCase…EndSelect语句可以判断运算符是什么运算符并对两个运算数进行相应运算就可以得到结果,把结果显示出来即可。为了捕获并处理异常,可使用OnError语句指定错误处理程序。在错误处理程序块中通过Err对象的Number属性中的错误号来判断错误的类型(算术运算溢出,错误号为6。过程参数错误,错误号为5),然后决定相应的处理。5.2任务5-1:具有非结构化异常处理的简单计算器——非结构化异常处理任务实现:1.启动VB.NET,新建一个项目,项目类型为“Windows应用程序”,项目的存放位置为“D:\VBTASK\CH05”,项目名为“Task5_1”。2.把Form1窗体的Text属性值设置为“简单计算器”,把它的Name属性值设置为“SimpleCalculator”。单击“解决方案资源管理器”中的“Form1.VB”窗体,然后在属性窗口中把它文件名属性设置为“SimpleCalculator.vb”。然后执行【项目】→【Task5_1属性】命令,在出现的“Task5_1属性页”对话框中把“启动对象”设置为“SimpleCalculator”。5.2任务5-1:具有非结构化异常处理的简单计算器——非结构化异常处理3.对照程序设计界面,为窗体添加控件并设置控件的属性。控件的属性设置如表5-1所示。控件名属性名属性值说明Label1Text结果:提示TextBox1Text显示算式或结果Button1Text清空单击它清空文本框中显示的内容Button2Text1单击它在文本框中显示的数字后连一个“1”Button3Text2单击它在文本框中显示的数字后连一个“2”Button4Text3单击它在文本框中显示的数字后连一个“3”Button5Text4单击它在文本框中显示的数字后连一个“4”Button6Text5单击它在文本框中显示的数字后连一个“5”Button7Text6单击它在文本框中显示的数字后连一个“6”Button8Text7单击它在文本框中显示的数字后连一个“7”Button9Text8单击它在文本框中显示的数字后连一个“8”Button10Text9单击它在文本框中显示的数字后连一个“9”Button11Text0单击它在文本框中显示的数字后连一个“0”Button12Text+把空格、+号和空格连接到文本框的Text属性中Button13Text-把空格、-号和空格连接到文本框的Text属性中Button14Text*把空格、*号和空格连接到文本框的Text属性中Button15Text/把空格、/号和空格连接到文本框的Text属性中Button16Text运算单击它计算出算式的结果并显示出来5.2任务5-1:具有非结构化异常处理的简单计算器——非结构化异常处理4.编写Button1的Click事件过程代码,如下。PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.ClickTextBox1.Text='清空文本框EndSub5.编写Button2的Click事件过程代码,如下。PrivateSubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.ClickDimbtnAsButton'按钮类型的变量btn=sender'把产生该事件的按钮对象赋值给btnTextBox1.Text=TextBox1.Text+btn.Text'把该按钮的Text属性值连接到TextBox1中EndSub5.2任务5-1:具有非结构化异常处理的简单计算器——非结构化异常处理6.运行程序,单击“1”按钮,发现每单击一次该按钮文本框中都将连接一个“1”,单击“清空”按钮,文本框中的内容将被清空。7.依次编写Button3~Button11各按钮的Click事件过程代码,并对各按钮