




免费预览已结束,剩余61页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VB.NET程序设计实用教程,第5章程序调试和异常处理,本章任务,具有非结构化异常处理的简单计算器,具有结构化异常处理的简单计算器,本章主要内容,在VB.NET中使用调试工具调试程序的方法,VB.NET的3种工作模式,VB.NET中的常用调试窗口,结构化异常处理语句(TryCatchFinallyEndTry语句)的功能与使用,非结构化异常处理语句(OnError语句和Resume语句)的功能与使用,主要内容,5.1程序的调试,程序中的错误可分为语法错误、逻辑错误或运行错误三种类型,系统会在语法错误的下面加上波浪线,比较容易查找和排除,而逻辑错误或运行错误排除则比较困难。当程序中出现了逻辑错误或运行错误而又难以解决时,就应该借助于程序调试工具对程序进行调试。所谓程序调试就是在应用程序中查找并修改错误的过程。通过程序的调试,可以纠正程序中的错误。为了更正程序中发生的不同错误,VB.NET提供了多种调试工具,如设置断点、插入观察变量、逐行执行和过程跟踪、各种调试窗口等。,5.1.1VB.NET的3种工作模式,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事件中,就可以通过查找空格的位置,通过字符串的取子串方法就可以获得两个运算数和运算符,然后通过SelectCaseEndSelect语句可以判断运算符是什么运算符并对两个运算数进行相应运算就可以得到结果,把结果显示出来即可。为了捕获并处理异常,可使用OnError语句指定错误处理程序。在错误处理程序块中通过Err对象的Number属性中的错误号来判断错误的类型(算术运算溢出,错误号为6。过程参数错误,错误号为5),然后决定相应的处理。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,任务实现:1启动VB.NET,新建一个项目,项目类型为“Windows应用程序”,项目的存放位置为“D:VBTASKCH05”,项目名为“Task5_1”。2把Form1窗体的Text属性值设置为“简单计算器”,把它的Name属性值设置为“SimpleCalculator”。单击“解决方案资源管理器”中的“Form1.VB”窗体,然后在属性窗口中把它文件名属性设置为“SimpleCalculator.vb”。然后执行【项目】【Task5_1属性】命令,在出现的“Task5_1属性页”对话框中把“启动对象”设置为“SimpleCalculator”。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,3对照程序设计界面,为窗体添加控件并设置控件的属性。控件的属性设置如表5-1所示。,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中EndSub,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,6运行程序,单击“1”按钮,发现每单击一次该按钮文本框中都将连接一个“1”,单击“清空”按钮,文本框中的内容将被清空。7依次编写Button3Button11各按钮的Click事件过程代码,并对各按钮的功能进行测试。各按钮的Click事件过程代码和Button2按钮的Click事件过程代码完成一样。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,8编写Button12按钮的Click事件过程代码,如下。PrivateSubButton12_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton12.ClickDimbtnAsButtonbtn=sender在文本框的Text属性后连接一个空格、本按钮的Text属性值和一个空格TextBox1.Text=TextBox1.Text+btn.Text+EndSub说明:连接两个空格的作用是把运算符和前后的两个运算数分隔开来,这样就可以通过字符串的Index方法找出空格的位置,然后再通过字符的Substring方法分离出两个运算数和运算符。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,9运行程序,通过单击数字按钮输入第一个运算数,单击“+”按钮输入“+”运算符号,再通过单击数字按钮输入第二个运算数,发现在两个运算数和“+”号之间均有一个空格。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,10依次编写Button13、Button14和Button15的Click事件过程代码,并对它们的功能进行验证。Button13、Button14和Button15的Click事件过程代码与Button12的Click事件过程代码完全一致。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,11编写“运算”按钮的Click事件过程代码如下。PrivateSubButton16_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton16.Click发生错误转移到标号“ErrorPro”指定的行去执行错误处理程序OnErrorGoToErrorProDimrAsDecimal保存计算结果的变量DimtAsString=TextBox1.Text用于保存文本框中的算术表达式DimspaceAsInteger=t.IndexOf()搜索空格位置,如果没有空格,返回值为0字符串的取子符方法,第二个参数小于0,则将产生错误号为5的异常,即过程参数不正确Dims1AsString=t.Substring(0,space)通过取子串方法获得第一个运算数DimopAsString=t.Substring(space+1,1)通过取子串方法获得运算符Dims2AsString=t.Substring(space+3)通过取子串方法获得第二个运算数Dimarg1,arg2AsIntegerarg1=Val(s1):arg2=Val(s2)SelectCaseopCase+:r=arg1+arg2Case-:r=arg1-arg2Case*:r=arg1*arg2Case/:r=arg1/arg2CaseElse,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,MsgBox(输入的运算符有误!)ExitSubEndSelectTextBox1.Text=CStr(r)显示结果ExitSub退出过程ErrorPro:错误处理程序块SelectCaseErr.NumberCase6除数为零时,或运算溢出时的错误号MsgBox(算术运算溢出!,溢出提示)TextBox1.Focus()ExitSubCase5Substring过程的参数不符合要求的错误号MsgBox(必须输入运算符和第二个运算数!,运算数少)ExitSubCaseElse其它情况显示错误号和错误原因MsgBox(错误号为&Err.Number&Chr(10)&Chr(13)&错误原因:&Err.Description)ExitSubEndSelectEndSub,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,说明:(1)程序中的“t.IndexOf()”的作用是在字符串变量t的值中查找空格第一次出现的位置,若找到则以整数形式返回空格所在位置(第一个字符的位置为0),若找不到则返回-1。IndexOf是字符串的一个方法,其作用是在字符串中查找子符的位置,查找到则返回位置值,查找不到返回-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”个字符开始,一直取到字符串的结尾作为子串返回。(3)程序中的语句“OnErrorGoToErrorPro”是一条非结构化的错误捕获语句,用来捕获程序中的错误。在非结构化异常处理中,将OnError语句放在代码块的开始处,它将处理在该块内发生的任何错误。如果在执行OnError语句后过程中引发了异常,程序流程将跳转到OnError语句中指定的行参数。行参数(行号或行标签)指示异常处理程序的位置。有时,在某过程中调用了另一个过程,并且在被调用过程中发生异常。这种情况下,如果被调用过程不处理异常,则异常传播回调用过程,并且程序流程将跳转到OnError语句中指定的行参数。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,OnError语句有以下四种形式:OnErrorGoToLineOnErrorResumeNextOnErrorGoTo0OnErroGoTo-1,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,OnErrorGoToLine该语句假定错误处理代码在Line参数指定的行处开始。该语句的作用是如果发生运行时错误,则将流程跳转到该Line参数中指定的行号和行标签,并激活错误处理程序。指定行必须与OnErrorGoToLine语句位于同一过程中,否则VisualBasic将生成编译器错误。请看下面的示例:SubErrTestOnErrorGoToErrorHandler可能包含错误的代码ExitSubErrorHandler:用于处理错误的代码ResumeEndSub,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,OnErrorGoToLine该语句假定错误处理代码在Line参数指定的行处开始。该语句的作用是如果发生运行时错误,则将流程跳转到该Line参数中指定的行号和行标签,并激活错误处理程序。指定行必须与OnErrorGoToLine语句位于同一过程中,否则VisualBasic将生成编译器错误。请看下面的示例:SubErrTestOnErrorGoToErrorHandler可能包含错误的代码ExitSubErrorHandler:用于处理错误的代码ResumeEndSub本例包含一个名为ErrorHandler的错误处理程序。如果ErrTest过程中的任何代码生成错误,VB.NET将立即执行ErrorHandler标签后面的代码。在错误处理程序块的结尾处,Resume语句将把程序流程转移到最先发生错误的代码行,重新执行发生错误的代码行及以后的代码。需注意的是,必须将ExitSub语句放在错误处理块的前面,否则,VB.NET在到达子例程的结尾时将运行错误处理代码,从而导致不可意料的结果。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,OnErrorResumeNext该语句的作用是如果在过程中出现运行错误,将把流程跳到发生错误的语句的下一条语句,再继续进行。使用该语句可以将错误处理过程放置于错误可能发生的地方,从而不需要在发生错误时将程序流程跳转到其他位置。如果在过程中调用了其他过程,则OnErrorResumeNext语句将在执行被调用的过程时被禁止。因此,应该将OnErrorResumeNext语句放置于每个被调用的过程中。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,OnErrorGoTo0该语句用于禁止当前过程中任何可用的错误处理代码块。如果不包含OnErrorGoTo0语句,则当退出过程时,其中的所有异常处理代码块都将被自动禁止。OnErrorGoTo0语句并不表示第0行是错误处理代码的起始,即使过程中包含第0行。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,OnErrorGoTo-1语句该语句用来禁止当前过程中任何可用的异常。如果不包含OnErrorGoTo-1语句,则当退出它的过程时,异常将被自动禁止。与OnErrorGoTo0语句类似,该语句也并不表示第-1行是错误处理代码的起始,即使过程中包含第-1行。下面通过一个实际的例子来说明OnError语句的使用。例子的作用是把异常处理程序命名为DivideByZero并处理除数为0的错误。如果发生不同的错误,VB.NET引发运行时错误并停止应用程序。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,示例代码如下:SubErrorTestExam()DimmAsInteger,mAsInteger,kAsIntegerOnErrorGoToDivideByZero捕获错误,异常处理程序被命名为DivideByZero.下面是代码的主体部分,可能产生错误m=6:n=0k=mnOnErrorGoTo0禁止异常处理Console.WriteLine(m&/&n&=&k)在执行错误代码之前应退出过程,如果该操作失败将产生意想不到的结果ExitSub异常处理程序DivideByZero:Console.WriteLine(Youhaveattemptedtodividebyzero!)输出错误提示信息n=1处理错误的代码Resume该语句将返回到首次发生错误的语句重新执行,应用程序可以继续执行下去EndSub注意:使用OnError的非结构化错误处理会降低应用程序性能并导致代码难以调试和维护。建议使用结构化错误处理方法。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,(4)在“ErrorPro”行号指定的错误处理程序块中,通过SelectCaseEndSelect语句测试错误号,然后决定相应的操作。错误号通过Err对象的Number属性值取得。Err对象包含与运行时错误相关的信息,在错误处理代码中通用对Err对象属性值的检测可以知道发生的错误。Err对象的属性值由刚发生的错误决定,Err对象的主要属性有:Number属性:该属性包含了错误代码,即导致错误的原因。Description属性:该属性包含了发生的错误的描述信息,是一个字符串属性。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,Err对象的常用方法有Raise和Clear,其格式与功能如下:Raise方法格式:PublicSubRaise(ByValNumberAsInteger,OptionalByValSourceAsObject=Nothing,OptionalByValDescriptionAsObject=Nothing,OptionalByValHelpFileAsObject=Nothing,OptionalByValHelpContextAsObject=Nothing)功能:产生一个错误。说明:参数Number为必选参数,是用于标识错误的特性的Long型数据。VisualBasic错误范围在065535内:范围0512保留用于系统错误,范围51365535则用于用户定义的错误。当在类模块中将Number属性设置为您自己的错误代码时,向vbObjectError常数添加您的错误代码号。例如,若要生成错误号513,应分配vbObjectError+513给Number属性。参数Source是一个可选参数,用来命名生成错误的对象或应用程序的String表达式。参数Description也是一个可选参数,是用来设定描述错误的信息,是一个字符串型表达式。例如,下列的程序代码是生成一个代号为513的用户定义的错误:Err.Raise(vbObjectError+513,SimpleCalCulator,本运算器现在不能用!),5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,Clear方法:该方法用来清除Err对象的所有属性值。任何错误处理程序都应该在其它错误发生之前,测试或保存Err对象的相关属性值。在错误处理例程中的ExitSub、ExitFunction、ExitProperty或ResumeNext语句执行之后,Err对象的属性重置为零或零长度字符串()。在错误处理例程以外,使用任何形式的Resume语句都不会重置Err对象的属性。但可使用Clear方法显式地重置Err。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,12运行程序,输入第一个运算数,输入“/”运算,再输入“0”,单击运算按钮,将出现算术运算溢出异常,如图5-10所示。只输入第一个运算数,直接单击“运算”按钮,将会出现过程参数不正确异常,如图5-11所示。13保存项目,至此本任务全部完成。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,归纳说明:异常处理是程序员在编写过程中必须要考虑的一件事,好的异常处理能使程序具有较强的容错能力和纠错能力。本任务通过计算器运算过程中容易出现的一些异常的解决方法,讲解了非结构化异常处理的一般方法:在容易发生异常的程序段前使用OnError语句指定错误处理程序块,在错误处理程序块中对出现的异常进行处理。在错误处理程序块中通过需要测试Err对象的Number属性以获取错误的类型,从而实施相应的处理。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,拓展与提高:错误处理程序块完成之后想要使程序继续执行,可使用Resume语句,该语句的形式主要有三种,下面分别加以讲述。(1)Resume0如果错误发生在错误处理程序所在的同一过程中,在错误处理程序中执行到该语句时,程序将由产生错误的语句处继续执行。如果错误发生在被调用的过程中,在错误处理程序中执行到该语句时,程序将从最近过程(该过程含有错误处理例程)调用的语句处继续执行。参数0可以缺省。(2)ResumeNext如果错误发生在错误处理程序所在的同一过程中,在错误处理程序中执行到该语句时,程序将从引发错误的语句的下一条语句处继续执行。如果错误发生在被调用的过程中,在错误处理程序中执行到该语句时,程序将从过程(该过程含有错误处理例程)调用的语句的下一条语句继续执行。(3)Resumeline在错误处理程序中执行到该语句时,程序将从必选参数line指定的代码行处继续执行。line参数是一个行标签或者行号,必须位于错误处理程序所在的同一过程中。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,使用该语句有以下两点需注意:(1)在错误处理程序中,还可以通过ExitSub、ExitFunction、ExitProperty等语句退出发生错误的过程。(2)如果在错误处理例程以外的任何位置使用Resume语句,将会引发错误。Resume语句不能用在含有Try-Catch-Finally语句的过程中。下面看一个Rsume语句的使用示例,该示例的作用是使用Resume语句来结束过程中的错误处理,然后继续执行导致错误的语句。,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,示例代码如下:SubResumeStatementDemo()OnErrorGoToErrorHandler激活错误处理程序DimmAsInteger=68DimnAsInteger=0DimkAsIntegerk=mn产生被0除的异常ExitSub退出过程ErrorHandler:程序处理程序SelectCaseErr.Number测试错误号Case6处理被0除的错误n=1设置y的值为1,以便重新除CaseElse此处放置处理其它错误的代码EndSelectResume返回到发生错误的语句执行EndSub,5.2任务5-1:具有非结构化异常处理的简单计算器非结构化异常处理,思考与实训:1为什么要进行异常处理?2非结构化异常处理的一般模式是什么?3Err对象的Number属性和Description属性各有什么作用?4编写一个除法计算器,用非结构化异常处理方法除数为0的异常和所有其它异常。当除数为零时,自动把除数设置为1,给出结果不可靠的信息并重新执行除法运算得到不可靠的结果,如图5-12所示。如果发生了其它异常则给出异常的提示信息,并退出过程,如图5-13所示。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,异常处理:任务5-2描述:在任务5-1的基础上增加对过程(调用的字符串的有关方法)参数格式不正确的异常捕获与处理,捕获该异常时的程序运行界面如图5-14所示。要求使用结构化异常处理。,图5-14参数格式不正确时的异常捕获与处理,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,任务分析:基本同任务5-1,只是处理异常的时候使用结构化异常处理语句TryCatchFinallyEndTry语句。捕获的算术溢出异常为System.OverflowException,捕获的参数不正确异常为System.ArgumentException,捕获的参数格式不正确异常为System.FormatException。任务实现:110与任务5-1的110步骤完成相同。11编写“计算”按钮的Click事件过程代码。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,任务实现:110与任务5-1的110步骤完成相同。11编写“计算”按钮的Click事件过程代码,如下。PrivateSubButton16_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton16.ClickDimrAsDecimal保存计算结果DimtAsString=TextBox1.Text用于保存文本框中的算术表达式TryDimspaceAsInteger=t.IndexOf()搜索空格位置字符串的取子符方法,第二个参数小于0,则将产生错误号为5的异常Dims1AsString=t.Substring(0,space)DimopAsString=t.Substring(space+1,1)用于保存运算符Dims2AsString=t.Substring(space+3)Dimarg1,arg2AsInteger整数运算可能会超出范围arg1=Convert.ToInt32(s1):arg2=Convert.ToInt32(s2)SelectCaseop,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,Case+:r=arg1+arg2Case-:r=arg1-arg2Case*:r=arg1*arg2Case/:r=arg1/arg2CaseElseMsgBox(输入的运算符有误!)MsgBox(输入的运算符有误!)ExitSubEndSelectTextBox1.Text=CStr(r)ExitSub退出过程CatchExamAsSystem.OverflowException算术溢出异常处理MsgBox(算术运算溢出!,溢出提示)CatchExamAsSystem.ArgumentException参数数目不够或值不在范围内异常处理,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,MsgBox(参数有误,应输入运算符和第二个运算数!,参数有误提示)CatchExamAsSystem.FormatException参数格式不正确异常处理MsgBox(字符串中出现了非数字字符,参数格式不正确提示)CatchExamAsSystem.Exception其它异常处理MsgBox(其它异常,错误号为:&Err.Number&Chr(10)&Chr(13)&错误提示:&Err.Description)EndTryEndSub,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,说明:(1)程序中的语句“TryCatchFinallyEndTry”是专门用于结构化异常处理的语句。结构化异常处理能帮助程序员创建和维护具有可靠、全面的错误处理程序的项目。在结构化异常处理中,代码块是封装的,每个块有一个或几个关联的处理程序。每个处理程序对它处理的异常类型指定某种形式的筛选条件。当受保护的代码块内的代码引发异常时,按顺序搜索相应的处理程序集,并执行第一个与筛选条件匹配的处理程序。(2)“TryCatchFinallyEndTry”语句用于处理给定代码段中可能出现的某些或所有错误,而同时代码仍保持运行。该语句的格式与功能如下。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,格式:TryTry语句块该语句块可能会引发异常CatchexceptionAstypeWhenexpression用于捕获Try语句块中的异常Catch语句块Catch语句块用来对捕获的错误进行处理Finallyfinally语句块Finally语句块,存放异常处理后执行的代码EndTry功能:执行“Try语句块”中的语句,如果产生异常,则系统自动查找离可以处理这个异常的语句最近的Catch语句,并且在运行时决定异常类型。首先,会寻找包含此代码的Try块。当找到Try块时,系统将从与此Try块相关联的一个或多个Catch块中,寻找一个符合条件的块执行。这个查找一直进行直到找到可以处理当前的异常的Catch块为止。找到异常处理块后,将执行其中的处理代码,在处理代码中进行异常处理或重新抛出异常。无论是否有异常发生,均会执行Finally块中的“语句组n+1”。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,说明:“exceptionAstype”用来指定捕获指定类型或其派生类型的异常。例如,若此项为“ExAsDivideByZeroException”,则在执行Try块时发生了整除除数为0的异常,将执行该Catch语句块。“Whenexpression”用来指定执行该Catch语句块必须要满足的条件,通常要根据Err对象中的某些信息来构成表达式。例如,若此项为“WhereErr.Number=6”,则在执行Try块时发生了数据溢出异常,将执行该Catch语句块。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,执行Try语句块发生异常时,将从第一个Catch块开始寻找匹配的异常,找到第一个匹配的异常时,执行其中的Catch语句块。执行过后,如果有Finally语句块则执行该语句块,如果无该语句块则跳出Try语句。可以省略Catch块。由于没有Catch块,程序执行过程中发生异常,如果有Finally块则将直接执行该块中的代码,否则将直接中断。Finally块也可以省略。但Catch块和Finally块不能同时省略。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,3)上述代码的Catch语句中的“System.OverflowException”、“System.ArgumentException”、“System.FormatException”和“System.Exception”均是VB.NET提供的异常类名。在VB.NET中,所有的异常都派生于System.Exception类,该类包含在公共语言运行库中。该类有两个重要的属性。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,如下:Message属性:该属性是只读属性,包含对异常原因的描述信息。InnerException属性:该属性也是一个只读属性,它包含这个异常的“内部异常”。如果它不是Null,就指出当前的异常是作为对另外一个异常的回答而被抛出。产生当前异常的异常可以在InnerException属性中得到。上述两个属性可以在System.Exception构造函数中赋值,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,。,为了对异常进行更细致的划分,VB.NET还提供了一些通用异常类,常用的通用异常类及其继承关系如图5-15所示。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,各种异常类代表的含义如下:Exception类:应用程序执行期间发生任何错误时,均会产生该类异常。SystemException类:该类是为System命名空间中的预定义异常定义的基类。ArithmeticException类:该类代表因算术运算、类型转换或转换操作中的错误而引发的异常。DivideByZeroException类:该类代表试图用零除整数值或Decimal数值时引发的异常。OverflowException类:该类代表进行算术运算、类型转换或转换操作导致溢出时引发的异常。NotFiniteNumberException类:该类代表当浮点值为正无穷大、负无穷大或非数字(NaN)时引发的异常。ArrayTypeMismatchException类:该类代表当试图在数组中存储类型不正确的元素时引发的异常。ArgumentException类:该类代表当向过程提供参数时,其中一个或多个无效时引发的异常。,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,ArgumentNullException类:该类代表当将空引用(在VisualBasic中为Nothing)传递给不接受它作为有效参数的方法时引发的异常。ArgumentOutOfRangeException类:该类代表当参数值超出调用的过程所定义的允许取值范围时引发的异常。FormatException类:该类代表当参数格式不符合调用过程的参数规范时引发的异常。IndexOutOfRangeException类:该类表示试图访问下标超出数组界限的数组元素时引发的异常。NotSupportedException类:该类表示当调用的过程不受支持,或试图读取、查找或写入不支持调用功能的流时引发的异常。NullReferenceException类:该类代表尝试取消引用空对象的引用时引发的异常。OutOfMemoryException类:该类代表没有足够的内存继续执行程序时引发的异常。StackOverflowException类:该类代表挂起的过程调用过多而导致执行堆栈溢出时引发的异常。阿,5.3任务5-2:具有结构化异常处理的简单计算器结构化异常处理,(4)一般在处理异常时,使用若干个Catch块把感兴趣的异常处理完,再用一个Catch块,处理剩余的其它异常,此时Catch块中的变量应是“System.Exception”类的变量,因为所有的异常由该类派生。(5)也可以通过不带参数的Catch来捕获Try块中的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 无缝墙布专业施工方案(3篇)
- 乡村扶贫慰问活动方案策划(3篇)
- 企业科技活动策划方案(3篇)
- 职场考试题库及答案解析
- 海事院校考试题库及答案
- 放射诊断考试题库及答案
- 北京市门头沟区2023-2024学年八年级下学期第一次月考道德与法制题目及答案
- 校长业务考试题目及答案
- 时间动态课件
- 100字的中秋作文(14篇)
- 2025年秋季学期(统编版)二年级上册语文教学工作计划及教学进度表
- 2025年福建省厦门市【辅警协警】笔试真题(含答案)
- (2025年标准)委托他人要账协议书
- 2025-2030中国青少年无人机教育课程体系构建与创新能力培养研究
- GB 11122-2025柴油机油
- 2025年广西中考语文试题卷(含答案)
- 联通技能竞赛考试题及答案(5G核心网知识部分)
- 初中七年级下册语文阅读理解十篇(含答案)
- 第2课 绘画作品中的劳动者 课件 五年级美术上册 岭南版(共15张PPT)
- 教学比武三测单的绘制课件
- 2022年江苏省基本公共卫生服务项目绩效考核指标表
评论
0/150
提交评论