1、程序设计不可能是一帆风顺的,其间总会发生各种各样的问题。例如,可能有键盘输入错误,也可能有程序的语法错误或者编写的程序有逻辑错误等。此时就需要对程序进行调试,以期找出问题并改正。VB.NET 2008的调试器是构建在开发环境中的,提供简单、灵活的调试功能。除此之外,在程序运行期间也可能发生这样或者那样的错误,这称为运行时错误。出现运行时错误时,程序会发出异常,以便通过在程序内查找用于处理错误的代码来处理错误。如果未找到这样的代码,程序将停止并需要重新启动。由于上述情况可能导致数据丢失,最好在可能预见错误发生的任何地方均创建错误处理代码,这称为异常处理。11.1 编程中的错误11.2 调试11.
2、3 异常处理编译错误 编译错误也称为编译器错误或者语法错误,是指妨碍程序运行的错误。运行时错误 运行时错误是指在程序运行时发生的错误。这些错误通常是在程序试图执行不可能执行的操作时发生。逻辑错误 逻辑错误是指妨碍程序执行您希望它执行的操作的错误。代码在编译和运行时可能都没有错误,但某个操作的结果却可能不是您期望的结果。查找并修复错误的过程称为调试。调试是我们在编程时查找错误并修正错误的最好方式。VB.NET 2008提供很多调试程序的方法,包括控制程序的执行流程、设置断点、查看运行时变量值等。调试程序时常需要控制程序的执行流程,包括开始执行、中断执行、结束执行、单步执行、执行到指定位置等。除此
3、之外,还可以让代码执行到指定光标处,方法是在希望执行到的代码处右击,在打开的右键菜单中单击【运行到光标处】。在调试一大段程序时,可能会想让代码运行到某一处,然后停下来检查是否是你所预期的结果,这时就要使用断点了。发生中断时,则称程序和调试器处于中断模式。可以让代码在任何定义断点的地方停止,并且可以在任何地方设置断点。注意,在设置断点的那行之前就会停止代码的执行。设置断点很容易,通过单击代码行旁边的灰边上的想要设置断点的位置,就可以在设计时或运行时的代码中进行设置了。断点是一个红色的圆点。此时,可以逐步向下执行代码或者运行到指定的光标位置,同时在执行的过程中查看某些关键变量的值来查找代码的逻辑问
4、题。查看变量的值最简单的方法就是将鼠标放在这个变量上,就会在打开的DataTips窗口中查看当前变量的值。当我们通过断点和单步执行,发现某些代码可能存在问题,而要试图修改时,可能并没有很明确的方法来修复错误,而是需要多次尝试。这时我们希望可以在不改变实际代码的情况下测试可能的修复以及代码修改后带来的结果,即时窗口可以帮助我们完成这样的功能。在中断模式下,即时窗口可以用于查看变量或者表达式的值或者运行代码段。例如,在中断模式下查看变量k的值,可以在即时窗口输入以下代码。Debug.Print(k)或者?k二者均返回变量k当前的值。并且,即时窗口也支持智能感知。即时窗口最有用的地方在于,它可以在设
5、计阶段执行代码,并得到代码的执行结果。特别在试图修改代码时,可以直接在即时窗口运行修改后的代码,以查看结果是否正确。可视化工具用于创建窗口或其他界面,以一种适合于变量或对象的数据类型的有意义的方式来显示变量或对象。文本可视化工具 HTML可视化工具 XML可视化工具 数据集可视化工具均用于字符串对象用于DataSet、DataView和DataTable对象11.3.1 11.3.1 异常的概念异常的概念在Visual Basic.NET中,错误机制是基于异常这个概念的。异常可被抛出以引发错误,并且在处理错误时可捕捉异常。如果没有提供任何类型的错误处理,当错误发生时,用户会接受到关于这个未处理
6、的异常的消息,这个消息是由CLR提供的,并不是用户友好的,用户很难理解。结构化异常处理是用Try.Catch.Finally.End Try语句实现的。Try 能够引发一个异常的代码 Catch 处理异常的代码 Finally 实现清理工作的代码(如关闭数据库连接等)End Try Try和End Try语句都是必需的。Catch和Finally语句可以共同使用于一个Try块中,但是必需至少使用其中之一。通常将可能导致异常的代码放在Try块中。如果这段代码在执行过程中产生异常,则转到Catch块中对该异常进行相应处理。最后,无论是否引发异常,Finally块中的代码最后一定会被执行。也可以这样
7、理解:Try块中放置正常的程序代码,Catch块中放置异常处理代码,而Finally块中放置一些无论是否发生异常都必须执行的代码,如释放资源、设置相关属性等善后工作。考虑到用户的输入,有可能存在以下两种情况。一是用户在【除数】文本框和【被除数】文本框没有输入整数,而是输入了其他内容,如字符串。二是用户在【被除数】文本框输入了“0”,产生了被零除的问题。因此可能存在两种类型的异常。1 Private Sub btnDevide_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Handles btnDevide.Cli
8、ck2 清空结果文本框3 txbResult.Text=4 结构化处理块5 Try6 获取用户输入并转换成整型,如果无法转换,则引发InvalidCastException异常7 Dim numerator As Integer=CInt(txbNumerator.Text)8 Dim denominator As Integer=CInt(txbDenominator.Text)9 除法运算,如果被除数为0,则引发DivideByZeroException异常。注意浮点数除法不引发该异常10 Dim result As Integer=numerator denominator11 txbR
9、esult.Text=result.ToString 12 异常处理13 Catch ex1 As InvalidCastException14 MessageBox.Show(必需输入两个整型的数字,Invalide Number Format,MessageBoxButtons.OK,MessageBoxIcon.Error)15 Catch ex2 As System.DivideByZeroException16 MessageBox.Show(ex2.Message,“Attemped Divide By Zero”,MessageBoxButtons.OK,MessageBoxIc
10、on.Error)17 End Try 18 End Sub捕获InvalidCastException异常捕获DivideByZeroException异常正常情况 捕获InvalidCastException异常捕获System.DivideByZeroException异常增加一个catch块:Catch ex3 As Exception MessageBox.Show(ex3.Message,发生其他异常,MessageBoxButtons.OK,MessageBoxIcon.Error)这样其他类型的异常也都可处理了。.NET框架中所有的异常均继承自Exception类。有若干个异常
11、类是直接从Exception继承,其中包括ApplicationException和SystemException,这两个类构成几乎所有运行库异常的基础。异常类型说明示例IndexOutOfRangeException仅当错误地对数组进行索引时,才由运行库引发在数组的有效范围外对数组进行索引:arr(arr.Length+1)NullReferenceException仅当引用null对象时,才由运行库引发D i m o A s o b j e c t =Nothing o.ToString()AccessViolationException仅在访问无效内存时由运行库引发当与非托管代码或不安全
12、的托管代码互操作时或者使用无效指针时发生InvalidOperationException当处于无效状态时,由方法引发从基础集合移除Item后调用Enumerator.GetNext()ArgumentNullException由不允许参数为null的方法引发D i m s A s S t r i n g =NothingDim str As String=c a l c u l a t e Console.WriteLine(str.IndexOf(s)ArgumentOutOfRangeException由验证参数是否位于给定范围内的方法引发D i m s A s S t r i n g =strings.Chars(9)