基于Visual Basic的程序错误及调试技术

2018-02-24 13:55刘模群
电脑知识与技术 2018年34期
关键词:断点

摘要:分析了Visual Basic程序中出现的各类错误,阐述了程序调试的方法和技术。使用这些方法,可以查找出程序中隐藏的错误并加以修正,对开发高质量的应用程序是有效的。

关键词:程序错误;程序调试;断点

中图分类号:TP312   文献标识码:A    文章编号:1009-3044(2018)34-0062-02

1 问题的提出

程序设计语言是目前高校理工类学生的一门必修的公共计算机课程,由于Visual Basic易学易用功能强大、界面可视化,受到很多高校的青睐。在Visual Basic软件的学习及其应用软件的开发过程中,程序调试的方法是很重要的,因为在编写程序的过程中,不可避免会发生一些错误。无论怎样精心地设计和编写代码,但实际上不能一次就使程序完全正确。特别是程序代码越复杂,出错的概率也就越大。如何找出这些隐藏在程序中的错误?只有掌握一定的程序调试技术,才能有效地将错误进行修正和排除。学生在学习Visual Basic的过程中,大多不太重视程序调试技术的掌握。有的同学在上机过程中,若程序出现错误,基本上是束手无策,导致对该门课程的学习失去兴趣。基于现实中的这一状况,为了解决这个问题,教师在教学的过程中,要注重培养学生调试程序的能力,使其掌握调试的方法,通过调试技术快速地找出程序中的错误所在。这样能提高学生上机编程时,实际动手解决问题的能力,通过理论和上机实践的相互结合,更好地促进课程的学习。

2 程序中的错误

2.1 语法错误

程序设计语言都有严格的语法规范,如果程序中的语句违反了有关的语言格式或使用规则,就会产生编译错误也称语法错误。例如,在输入Visual Basic代码时,关键字拼写不正确;没有正确地使用规定的标点符号;函数的使用不符合规定;调用了某个不存在的函数或过程;分支语句或循环语句的结构不完整或不匹配,如有If没有End If、有For没有Next;程序中用到了数组元素,而相应的数组变量并没有定义;使用了错误的属性或方法等。一般在程序输入过程中,如果违反了Visual Basic的语法规则,系统会立即给予警告。输完一行代码回车后,出错行会变成红色字体(已设置了自动语法检查功能),并将错误加亮显示,同时显示一个消息框,指出错误所在以帮助修正。有些语法错误,只有在程序进行编译时才能检测到,语法错误一般比较容易发现和排除。实践中我们得出经验,输入完一行语句准备输入下一行时,如果关键字开头字母没有自动变成大写,那么这一行语句就很可能存在错误。如果设计窗体时已经有了某个控件对象,在代码窗口中要设置该对象的属性或方法时,如果输入了对象名并键入了点后(如Command1.),此时若没有立即弹出属性方法下拉列表框,那么也许对象名拼写就有错误。

2.2 运行错误

运行错误是指在程序运行过程中,由于试图执行不能执行的操作而引发的错误,也称为实时错误。对于这类错误来说,语句本身是符合语法规则的,程序的逻辑也没有问题,所以在编译阶段是不会检测出错误的。但这些语句无法正确地运行,在运行阶段会给出相应的出错提示,并中止程序的运行。这类错误情况比较复杂,能引起运行错误的原因是各种各样的。例如变量的类型不匹配,引用了不存在的控件对象,浮点数运算产生溢出,过程定义调用不当(如形参、实参设置不一致),打开一个不存在的文件用以读取数据,试图对某些控件的只讀属性进行赋值或修改操作等,这些都会造成程序运行中断。假设有x、y、z三个单精度型变量,且x和y的值通过键盘输入:如果有Text1.Text=x/y语句,若此时输入的y值为0,则会产生“除数为0”的运行错误;若y的值不为0,但此时窗体中并不存在Text1这个对象,则会产生“要求对象”的运行错误。如果有z=Sqr(x)语句,但输入的x值为负数,则会产生“无效的过程调用或参数”的运行错误。

2.3 逻辑错误

编写的程序没有语法错误(即编译时没有出错),程序也能正常运行,但运行结果不对,不能实现预定的处理功能要求而产生的错误,这就是逻辑错误。逻辑错误多是由于算法错误引起的,即程序设计的总体逻辑思路和算法方面存在问题。算法是错误的,计算机执行后当然得不到正确的结果。但有时算法是正确的,但由于编写代码时不小心写错了,如条件表达式不正确造成程序流程错误,从而引发逻辑错误,程序错了结果当然不正确。逻辑错误不会使程序中断,但不会得到预期的结果。由于系统无法自动检测逻辑错误,也没有错误提示信息,所以这类错误一般很难查找,需要对程序仔细检查,通过测试和细致分析程序的执行流程,才能定位错误所在。例如,常见的“死循环”就属于这类错误,程序始终无法跳出循环体,从而造成了“死循环”,可以通过按Ctrl+Break组合键来强行终止程序的执行。再如,找出变量x和y两个数中的最大数,若错误地写成“If x > y Then Print y”,显然也不可能得到正确的结果。

2.4 减少错误的有效方法

只要程序能够执行下去,计算机就会按照流程一条条地执行语句,计算机本身并不能理解设计者的本意。为了有效防范程序错误的产生,程序设计时要养成良好的编程习惯。例如:书写程序时,采用逐层缩进的规范化的语句格式;多加注释,便于编程结束后分析代码时,能更容易地理解这些代码,降低错误查找的难度;使用模块化结构设计代码,为每个过程指定一个明确的功能目标,便于较容易地判断出错误所在的区域;声明对象时,尽可能不用Variant或笼统的Object数据类型;设置Option Explicit强制变量说明语句,以避免变量名的拼写错误;在应用程序中,对变量和对象使用前后一致的命名方法。这样,可以尽可能地减少程序错误发生的概率。

3 程序的调试

3.1 调试工具与中断状态

设置自动语法检查:此项设置是Visual Basic的默认设置,它能自动检查语法及编译错误。如果没有设置,可以通过“工具”菜单中的“选项”,对话框中选择“编辑器”选项卡,勾选“自动语法检测”即可。设置好后,一旦输入的代码有语法错误,系统将自动检测到,弹出有关错误的提示信息,这可以大大帮助编程者修正错误。

Visual Basic调试工具:使用调试工具,可便捷有效地检查逻辑错误产生的位置和原因,帮助编程者分析程序的运行是如何进行的。这些调试工具可以从“调试”菜单上选择调用,Visual Basic还专门提供了一个用于程序调试的工具栏。如果该工具栏不可见,可以选择“视图”菜单中的“工具”,然后单击“调试”命令即可。调试工具栏中各按钮与“调试”菜单中对应的菜单命令功能一样,用户可利用该工具栏提供的便捷按钮运行要测试的程序、监视变量和表达式的值、中断程序的运行、设置断点、逐语句逐过程调试,这些调试功能可以帮助用户处理程序中的逻辑错误。

中断状态:中断是指程序运行时中途被停止,有的调试工具只能在中断模式下才能使用。中断状态下,用户可以查看各个变量及属性的当前值,还可以修改发生错误的程序代码,从而方便用户对程序的调试。程序进入中断状态一般有四种方式:程序在运行过程中,由于发生错误而进入中断状态;运行状态下,按下Ctrl+Break组合键或执行“运行”菜单中的“中断”命令而进入中断状态;程序执行到用户在语句中创建的断点处时,进入中断状态;在使用单步(单语句单过程)执行方式时,每运行一步可执行代码行后,即进入中断状态。在纠正了程序的错误之后,只要执行“运行”菜单中的“继续”或“重新启动”等命令,可退出中断状态。

3.2 断点设置与单步调试

断点设置:为了调试程序,在程序中人为地添加一些暂停运行的“断点”,以便检查程序的执行情况。断点通常安排在程序代码中能反映程序执行状况的部位,比如循环等结构语句的内部。如果出现死循环,为了确定出错原因,可以在循环体内设置一个断点,每次执行循环体时都会在断点处引起中断,这时就可以查看分析其中的变量变化情况,从而找出循环不能超越边界值的原因。为了保证程序每个组成部分的正确性,可以在过程中设置断点,对某些过程进行跟踪检查,设置断点是检查并排除逻辑错误和比较复杂的运行错误的行之有效的手段。设置断点的方法是,在代码编辑窗口中,将光标定位到打算作为断点的语句上,单击该行语句左侧的灰色区域,出现一个暗红色的圆点,这就是断点,并且该行红底反白显示。若要清除已经设置的断点,只需再次单击该“圆点”,就可将该断点取消。

单步语句调试:即逐语句执行程序,每次执行一条语句,然后就发生中断,因此可以逐个语句地检查每条语句的执行状况。当遇到过程调用时,就进入此过程继续单步语句执行。单步执行程序时,可以检查程序中各变量的当前实际值。要单步语句执行程序,只要单击调试工具栏中的“逐语句”按钮,或者选择“调试”菜单中的“逐语句”命令,或者按F8快捷键来实现。每单步执行一条语句,在“代码编辑器”窗口中,标志下一个要执行的语句的箭头和彩色框也随之向下移动一条语句。由于逐语句执行跟踪了程序的控制流程,所以便于观察条件语句的判断结果和循环语句的边界状态,以及程序能否正常终止等。

单步过程调试:即逐过程执行程序。当单个过程可以确认不存在错误时,则不必对该过程再进行单步语句调试,而是直接执行整个过程,这就是单步过程调试。逐过程执行时,逐条执行每条语句,遇到过程调用时,把被调用的过程当作一个语句(即一个整体)来执行,并不跟踪到过程的内部。要单步过程执行程序,可以用单击调试工具栏上的“逐过程”按钮,或者执行“调试”菜单中的“逐过程”命令,或者按Shift+F8快捷键来实现。

3.3 使用调试窗口

进入中断模式后,可打开相关调试窗口,对变量、表达式以及对象的属性进行跟踪观察。

“本地”窗口:本地窗口可以自动显示当前过程中所有过程级变量的当前值,若从一个过程进入另一个过程,那么本地窗口的内容会相应更改为另一个过程中的过程级变量的取值情况。“本地”窗口中的第一行Me表示当前窗体,用鼠标单击Me前面的“+”号,可以将窗体及窗体中各控件对象的属性“树”展开,即可查看各个属性的当前值。此时,常常用单步语句执行的方式,随时监视过程中过程级变量的值和对象的属性值的变化情况。单击“视图”菜单中的“本地窗口”,或单击调试工具栏上的“本地窗口”按钮,即可打开“本地”窗口。

“监视”窗口:监视窗口用于查看指定表达式的值,在监视前先要添加被监视的表达式。可以使用“调试”菜单中的“添加监视”命令来指定“监视表达式”,弹出的对话框中还可以指定监视表达式所在的“过程”和“模块”位置,以及监视的类型。选择“调试”菜单中的“编辑监视”命令,可以对监视项进行修改或删除。当应用程序进入中断模式后,这些监视表达式和它们的值就会出现在“监视”窗口中。单击“视图”菜单中的“监视窗口”,或单击调试工具栏上的“监视窗口”按钮,都可以打开“监视”窗口。

监视窗口与本地窗口相比较优点在于,监视窗口可以在一个界面中查看所有过程中需监测的表达式的值,而本地窗口主要查看当前过程中的变量值。

“立即”窗口:立即窗口可以顯示任何变量或表达式的值。可以在立即窗口输入代码并立即执行来获取有关信息,如使用Print方法来显示变量或属性或表达式的值,Print也可以用?代替。还可以在程序代码中用Debug.Print语句,把输出结果送到“立即”窗口中显示。立即窗口是功能较为全面的查看变量或表达式的调试窗口,但每次查看时都需要手动输入,与其他两种调试窗口相比略显不便。

4 结束语

程序调试不能仅仅停留在理论层面上,一定要在具体的上机实践中去摸索,不断积累经验。例如,理论上通常是设置断点,通过调试窗口跟踪变量或表达式的变化情况;但在具体的程序设计中,还往往在代码的适当位置加一些临时的输出语句来观察变量或表达式的值。再如,中断模式下查看程序中变量、属性或函数的值,我们最直接的方法是将鼠标移到其上面放置不动,过一会屏幕便会自动显现出所指项目的数据提示。当程序出错时,我们还会增加相应的出错处理程序来进行处理。程序调试是一项细致而复杂的工作,掌握调试的技术并在实际中多应用多探究,对快速发现并排除程序中的错误,编写出高质量的程序代码会有很大的帮助。

参考文献:

[1] 刘模群. Visual Basic程序设计[M]. 杭州: 浙江大学出版社, 2013.

[2] 宋翔. VB程序的调试和常见错误的捕获及错误处理方法[J]. 陕西教育: 高教版, 2011(7-8): 208, 214.

[3] 谭浩强. Visual Basic程序设计[M]. 3版. 北京: 清华大学出版社, 2017.

【通联编辑:谢媛媛】

猜你喜欢
断点
一种适用于继电保护在线整定的极小断点集求取算法
新能车属性离散化的分辨矩阵和信息增益算法
砂泥互层断点组合类型及其合理性分析
——以大庆长垣萨尔图油田为例
用Eclipse调试Python
一类无限可能问题的解法
三维地震在新疆伊宁矿区北区七号矿井勘探的应用
主导电回路发生断点故障判断方法探讨
基于保护协调配合的最小断点集选取方法
TKScope仿真调试Cortex-M3内核的高级手段
基于Rough集的集成离散化算法