程序的调试国海涛.docx

上传人:b****3 文档编号:4105334 上传时间:2023-05-06 格式:DOCX 页数:18 大小:556.26KB
下载 相关 举报
程序的调试国海涛.docx_第1页
第1页 / 共18页
程序的调试国海涛.docx_第2页
第2页 / 共18页
程序的调试国海涛.docx_第3页
第3页 / 共18页
程序的调试国海涛.docx_第4页
第4页 / 共18页
程序的调试国海涛.docx_第5页
第5页 / 共18页
程序的调试国海涛.docx_第6页
第6页 / 共18页
程序的调试国海涛.docx_第7页
第7页 / 共18页
程序的调试国海涛.docx_第8页
第8页 / 共18页
程序的调试国海涛.docx_第9页
第9页 / 共18页
程序的调试国海涛.docx_第10页
第10页 / 共18页
程序的调试国海涛.docx_第11页
第11页 / 共18页
程序的调试国海涛.docx_第12页
第12页 / 共18页
程序的调试国海涛.docx_第13页
第13页 / 共18页
程序的调试国海涛.docx_第14页
第14页 / 共18页
程序的调试国海涛.docx_第15页
第15页 / 共18页
程序的调试国海涛.docx_第16页
第16页 / 共18页
程序的调试国海涛.docx_第17页
第17页 / 共18页
程序的调试国海涛.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

程序的调试国海涛.docx

《程序的调试国海涛.docx》由会员分享,可在线阅读,更多相关《程序的调试国海涛.docx(18页珍藏版)》请在冰点文库上搜索。

程序的调试国海涛.docx

程序的调试国海涛

10V程序的调试与异常处理

当程序有了一定的复杂程度后,无论用户在编写程序时如何仔细,错误总是不可避免的。

有些错误非常简单,很容易排除。

而有些错误隐藏得很深,必须采用一些特殊的手段才能找出来。

本章学习VisualStudio.NET中一些常用的调试方法如:

在代码中设置断点等。

调试是任何开发项目中一个不可少的部分,因为它可以帮助找到代码和逻辑中的错误。

10.1主要错误类型

为了更有效地使用调试工具排除程序中的错误,开发人员必须对可能产生的错误有一个全面的认识。

程序中的错误千差万别,各不相同。

综合起来可以将这些错误分为四类,分别是:

语法错误、编译错误、运行错误、逻辑错误。

10.1.1语法错误

当程序的编写出现了违反VB.NET语法规则的地方,就会发生语法错误。

比如说变量没有声明、参数类型不匹配等。

此类型的错误通常发生在程序员对语言本身的熟悉度不足,如If之后忘了加上Then,For语句少了Next。

还有比如定义一个变量是student,但是在引用的时候不小心就变成studnet了。

在编译程序之前,VB.NET会及时发现程序中的语法错误,并用波浪线标示出来。

当把鼠标移到该处时,系统会相应的出错提示信息(如图10.1)。

语法错误是最容易发现和改正的错误。

 

图10.1语法错误示例

10.1.2编译错误

编译错误是指程序在编译过程中出现的错误。

编译错误是由于不正确编写代码而产生的,比如非法使用或丢失关键字、遗漏了某些必需的标点符号、函数调用缺少参数或括号不匹配等。

下面的代码都会导致编译错误:

ForI=lTo100'For关键字写错

X=Math.Sin'函数调用缺少参数

10.1.3运行错误

运行错误是指程序中的语句本身是正确的,但是这些语句在运行时无法正确执行,从而导致程序发生错误。

运行错误比语法错误更加隐蔽,这是因为运行错误是在程序执行时遇到了一些非法操作引起的。

这类错误常见的有:

打开一个不存在的文件、磁盘空间不足、网络连接断开、除运算中除数为0、从服务器读取数据时发生服务器断开连接、输入的数据类型不匹配等。

这类错误在程序编辑或编译时不会被发现,只有在运行时才会发现。

程序在运行时发生错误,系统通常会给出一个错误提示信息,然后终止程序的运行。

10.1.4逻辑错误

逻辑错误是指程序算法的错误,这种错误程序不会发生任何程序中断或跳出程序,而是一直执行到最后,可能会有结果,但是执行结果是不对的。

此类错误是最常见的,也是最难发现和调试的。

例如:

Dimi,totalAsInteger

Whilei<10

total+=I

i+=l

EndWhileMsgBox(total)

很明显这个算法有问题,应该是i<=10,不是i<10,因此执行出来的结果少了10,结果为45。

这种错误调试困难,因为程序员认为它是对的,所以只有程序员细心测试,以及调试工具的协助。

10.2程序的调试

在学习调试之前,先熟悉一下VB.NET的三种模式。

(1)设计模式(设计)

在设计模式下,可以进行程序的界面设计、属性设置、代码编写并定位语法错误,但是不能测试逻辑错误和运行时错误。

(2)运行模式(运行)

执行启动命令进入运行模式。

在运行模式下,可以检查程序的执行,并检测逻辑错误和运行时错误,但不能对代码作任何更改。

(3)中断模式(Break)

执行中断命令,进入中断模式。

在中断模式下可以查看代码、修改代码、检查数据。

通过专用的工具在应用程序中查找并修改错误的过程称为调试。

VisualBasic.NET提供了强大的调试工具,使用这些工具能帮助分析程序运行过程,并分析变量和属性是如何随着语句执行而改变的,从而深入到应用程序内部,确定代码到底发生了什么问题,以及为什么会发生。

VisualBasic.NET调试工具包括:

断点、调试工具栏和调试窗口。

VisualBasic.NET的这些强大的调试工具和功能可以帮助开发人员快速完成程序调试任务,并排除程序中的错误。

10.2.1VB.NET的调试工具

使用调试工具时,可以通过【调试】菜单,也可以使用【调试】工具栏。

如果调试工具栏没有再工具栏上显示,可按下面的步骤打开【调试】工具栏。

(1)选择【视图】→【工具栏】菜单项。

(2)在【工具栏】下的子菜单中选择【调试】命令,【调试】工具栏会出现在VisualBasic.NET的桌面上。

10.2.2常用的调试对话框

调试应用程序时,经常要分析应用程序的程序段或语句的运行结果,并希望能够看到变量、属性、表达式等值的变化,以便找出错误所在处。

为便于观察程序块或语句的运行结果,VB.NET提供了很多调试对话框,利用这些对话框可以提高程序调试的效率。

(1)任务列表窗口

在VisualBasic.NET中,如果开发人员的应用程序中存在没有清除的语法错误,在调试时,调试程序会查找到这些语法错误,并将错误信息显示在【任务列表】窗口中。

【任务列表】窗口不但显示出错误的类型和说明,还显示出错的文件,以便开发人员快速定位和修改错误。

如果要马上修改某一个错误,可以在任务列表中双击它,IDE会自动跳转到代码窗口中,并加亮显示相应的错误内容。

实际上,【任务列表】窗口在开发人员设计程序时也存在,只是没有显示出来。

如果开发人员要在编写代码时打开“任务列表”窗口,显示所有没有发现的语法错误,可以选择【视图】→【显示任务】→【生成错误】命令(如图10.2)。

图10.2任务列表窗口

(2)输出窗口

VisualBasic.NET把【输出】窗口的功能分为两部分:

调试和生成。

在【输出】窗口中,从【生成】选项可以查看调试的程序生成的内容,包括成功的个数和失败的个数。

如果没有生成失败,表明程序创建成功。

如果开发人员要查看调试输出结果,可从【输出】窗口中的下拉列表框中选择【调试】选项,窗口中就显示出所有已经加载的内容和输出结果。

图10.3输出窗口

(3)【命令】对话框

在VB.NET中,有一个【命令】对话框,在该对话框中可以直接使用VB.NET的各种命令与系统交互。

利用它可以通过查询并设置变量的值,来控制程序的执行和输出。

【命令】对话框有两种不同的模式:

命令模式和立即模式。

命令模式主要用来执行命令,立即模式主要用于调试程序。

在调试应用程序执行函数或语句等操作时,可使用立即模式查看,并更改变量的值。

通过执行【调试】→【窗口】→【即时】命令,可以以立即模式打开【命令】对话框。

当命令窗口处于立即模式时,标题栏显示【命令窗口-立即】。

图10.4示例程序图

在上图程序调试过程中,在【命令】对话框中输入?

i和?

j,显示如图10.5:

图10.5立即窗口

 

在【命令】对话框中也可以改变变量的值,与在程序中修改变量值的格式一样:

变量名=变量值。

在上面程序中输入i=5,然后再输入?

i和?

j,显示如图10.6。

很显然i的值发生了变化。

图10.6立即调试结果显示

(4)【监视】对话框

【监视】对话框用于显示当前被监视表达式的值。

【监视】对话框只能在运行模式或中断模式下打开,打开方法是执行【调试】→【窗口】→【监视】命令。

若要在【监视】对话框中添加被监视表达式,只需单击【监视】对话框名称列最下面一行单元格,在其中输入要监视的表达式即可。

【监视】对话框是最有用的对话框之一,在逐语句运行的情况下,通过该对话框可以看到每执行一条语句时,监视表达式值的变化情况。

图10.7显示在运行到所设置的断点处,变量i、j的值,并可以看到数据类型、取值范围等。

图10.7监视对话框

利用watch【监视】也可以方便的观察表达式的值,如图10.8添加表达式i*j。

图10.8监视结果查看

 

当程序处于中断模式时,只能在QuickWatch【快速监视】(图10.9)对话框中添加和删除变量或者表达式。

因此在运行程序之前,需要在想监视的变量或者表达式之前设置一个断点。

运行到断点后,单击调试菜单,并选择QuickWatch【快速监视】,打开QuickWatch【快速监视】对话框,在表达式下拉列表框中添加表达式i+j,然后单击关闭,可以看到i+j的结果显示在监视对话框中,如图10.10。

图10.9快速查看窗口

图10.10查看结果

(5)【局部变量】对话框

【局部变量】对话框和监视对话框非常的相似,但显示当前过程中所有局部变量的值。

【局部变量】对话框也可以改变变量或对象的值,方法与监视对话框相似。

当程序从一个过程执行到另一个过程时,【局部变量】对话框的内容也会随之改变。

该对话框只显示当前所执行过程中局部变量的值。

要打开【局部变量】对话框,可执行【调试】→【窗口】→【局部变量】命令,显示如图10.11。

图10.11局部窗口

10.2.3常用调试方法

(1)设置程序断点

在调试一个大程序是,经常只需要调试其中的一部分代码。

也就是说,让代码运行到某一处然后停下来。

这时候需要断点。

断点可以让代码在任何定义断点的地方停止。

当然可以在代码的任何位置设置断点,代码运行到设置断点处的前一行就会停下来。

在设置断点的那行的前面显示一个小红球。

注意程序执行是不能设置断点,当可以在程序空闲时,等待输入时设置断点。

断点是应用程序暂时停止执行的位置,也是让应用程序进入中断模式的地方。

在程序设计中,可以在中断模式和设计模式下设置和删除断点。

在调试程序时,按照程序的功能,可在怀疑有错误的语句处设置断点,这样有利于发挥测试程序的功能和发现程序的逻辑错误。

设置断点的方法主要有以下几种:

1)在代码窗口中,单击要设置断点的那一行代码,然后按【F9】键。

2)在代码窗口中,在要设置断点的那一行代码行上,单击鼠标右键并选择【插入断点】命令。

3)在代码窗口中,在要设置断点的那一行代码行的左边界上的竖条上单击。

图10.12设置断点

(2)跟踪程序执行

当程序出错的具体位置不易确定,只能够猜测到在某个范围内可能存在问题时,需要在此范围内追踪程序的执行结果,逐条地执行语句。

这种运行方式称为“跟踪”。

VisualBasic.NET提供的跟踪方式有:

逐语句(StepInto)、逐过程(StepOver)和跳出(StepOut)。

第一个图标是StepInto(逐语句执行)。

逐语句执行方式为一次执行一条语句,也叫单步执行。

包括单步调试遇到的任何函数或过程,并对这些函数或过程中的代码进行单步调试。

每执行一条语句之后,开发人员可以使用【即时】窗口、【局部变量】窗口或【监视】窗口查看语句执行的效果。

第二个图标是StepOver(逐过程执行)。

编写复杂的应用程序时,应用程序的一个过程通常会调用另一个过程或函数,有时候,并不想了解调用过程的执行细节,而只想关注当前过程的执行情况,可以使用【逐过程】命令。

也就是说这些函数或过程仍在执行,只是其中的代码是一次执行完的。

第三个图标是StepOut(跳出)。

【跳出】命令连续执行当前过程剩余部分的语句,并在调用该过程的下一行处中断执行。

当单步执行到一个很长的过程中,想退出该过程时可以使用该图标,过程中的其余代码会一次性执行,而不是单步调试执行。

10.2.4调试案例

新建基于Windows应用程序的VisualBasic.NET项目。

在Form1_Load实践中添加如下代码。

PrivateSubForm1_Load(ByValsenderAsObject,ByValeAsSystem.EventArgs)HandlesMyBase.Load

DimseAsString

Label1.Text=Space(35)&"九九乘法表"&vbCrLf

Label1.Text&=Space(35)&"-----------"&vbCrLf

Fori=1To9

Label1.Text&=Space(8*(i-1)+i)

Forj=iTo9

se=i&"×"&j&"="&i*j

Label1.Text&=se&Space(8-Len(se))

Nextj

Label1.Text&=vbCrLf

Nexti

EndSub

下面利用这个案例来说明中断模式。

可以利用上面的方法,设置断点,在编辑器中的显示如图10.13所示。

图10.13设置断点

可以通过【调试】→【窗口】调出我们上面讲的各个对话框,如图10.14。

 

图10.14调试常用窗口

参照上面讲的每个窗口的方法,可以进行调试。

10.3异常处理

调试工具的使用只能用于清除程序代码中存在的错误,无法处理运行过程中发生的非预期的或不正常的错误,部分异常错误可以设计程序时考虑到并采取预防措施,从而避免程序的异常终止。

“异常”是指应用程序在执行过程中遇到的错误或意外,从而导致应用程序终止执行,它来自于程序本身或运行时环境。

在出现生异常时,CLR创建一个称作异常的特殊对象,该对象中的方法和属性详细描述了异常情况以及引起错误的具体原因。

“异常处理”是指程序运行时出现错误时采取相应措施的.NET技术,异常处理需要在编程过程中事先设定,在程序出错时能够得到详细信息和补救的重要手段。

10.3.1异常的重要属性和方法

异常对象是一个包含错误相关信息的对象,这些信息显示为该对象的属性。

该对象是派生于System.Exception类的一个实例。

Exception类的属性包含了关于异常的信息。

查看其属性可以确定代码位置、类型以及异常的起因。

Exception对象的一些常用属性如表10-1所示。

表10-1Exception类的属性

属性

说明

Data

获取一个提供用户定义的其他异常信息的键/值对的集合。

HelpLink

获取或设置指向此异常所关联帮助文件的链接。

HResult

获取或设置HRESULT,它是分配给特定异常的编码数值。

InnerException

获取导致当前异常的Exception实例。

Message

获取描述当前异常的消息。

Source

获取或设置导致错误的应用程序或对象的名称。

StackTrace

获取调用堆栈上直接帧的字符串表示形式。

TargetSite

获取引发当前异常的方法。

表10-2Exception类的方法

属性

说明

Equals(Object)

确定指定的Object是否等于当前的Object。

(继承自Object。

Finalize

允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。

(继承自Object。

GetBaseException

当在派生类中重写时,返回Exception,它是一个或多个并发的异常的根源。

GetHashCode

用作特定类型的哈希函数。

(继承自Object。

GetObjectData

当在派生类中重写时,用关于异常的信息设置SerializationInfo。

GetType

获取当前实例的运行时类型。

ToString

创建并返回当前异常的字符串表示形式。

(重写Object.ToString。

MemberwiseClone

创建当前Object的浅表副本。

(继承自Object。

详情参考:

10.3.2结构化处理

简单来说,结构化异常处理就是使用包含异常、单独的代码块和筛选器的控制结构创建异常处理机制。

它使代码可以区分不同的错误类别,并根据相应的情况做出响应。

与非结构化异常处理相比,结构化异常处理更强大,更具普遍性和灵活性。

.NET中所有编程语言采用统一的错误处理方式,即“结构化的异常处理”。

Try…Catch...Finally控制结构是结构化异常处理的基本结构。

它测试代码片段,筛选该代码执行过程中产生的异常,并根据产生的异常类型做出不同的响应。

将可能产生异常的代码段放在Try语句之后,将对异常进行处理的代码段放在Catch或Finally之后。

Try…Catch...Finally语法如下:

格式:

Try

可能产生异常的语句系列

Catch异常变量1As异常类型1、

异常处理语句序列1

Catch异常变量2As异常类型2

异常处理语句序列2

......

Finally

异常处理语句序列n

EndTry

说明:

(1)Try语句提供正在测试异常的代码。

(2)Catch子句标识与特定异常相关联的代码块,Catch子句按其在代码中出现的顺序执行。

Catch子句可采用三种格式:

Catch、Catch...as和Catch...when。

不包含when关键字的catch子句允许相关的语句块处理所有异常。

catch...as和catch...when子句捕捉特定的异常,并允许相关的语句块指导应用程序如何处理。

也可以将catch...as和catch...when子句组合成一条语句,例如:

Catchexasexceptionwhenintresult<>0。

(3)不管try块中是否发生异常,finally语句所包含的代码始终会执行。

即使在exittry或exitsub语句后也会执行finally语句。

此代码通常执行清除任务,例如关闭文件或清除缓冲区。

当“可能产生异常的语句系列”出现异常时,将判断异常的类型。

如果异常类型是“异常类型1”,将执行“异常处理语句序列1;如果异常类型是“异常类型2”,将执行“异常处理语句序列2”;依此类推。

其中的“Finally”和“异常处理语句序列n,是可选项。

如果存在该可选项,执行完前面的异常处理的语句序列后,将执行“异常处理语句序列n”。

在异常处理的语句序列中,可以使用ExitTry。

ExitTry的功能是结束异常处理结构,跳出Catch程序段并跳到Finally处,若没有Finally语句则运行EndTry之后的语句序列。

Finally代码段通常做代码清除工作。

【案例】Try…Catch...Finally语句举例。

PrivateSubForm1_Click(ByValsenderAsObject,ByValeAs_System.EventArgs)HandlesMyBase.Click

DimN01AsInteger

DimN02AsInteger

DimRESULTAsInteger

Try

N01=InputBox("请输入被除数:

")

N02=InputBox("请输入除数:

")

RESULT=N01/N02

CatchERR1AsSystem.OverflowException'表示发生溢出错误

IfN02=0Then

MsgBox("0不可做除数!

")

ExitTry'跳出Catch程序段并跳到Finally处

EndIf

Catch

MsgBox("发现其它错误!

")

Finally

MsgBox("处理完毕!

")

EndTry

MsgBox("结果为:

"&RESULT.ToString)

EndSub

(1)本题中第一条Catch语句捕获一个指定类型的异常,即产生溢出的异常,并且设置了Exception类的对象变量ERR1;第二条Catch语句可以捕获在Try代码段出现的其它任何异常。

(2)Finally块是可选项,然而若有Finally块,最后就一定会执行,不管程序是否发生了异常。

(3)双Catch语句捕捉是一种良好的捕捉异常的方法,如果异常逃脱了第一条Catch语句,第二条语句肯定可以捕捉到它!

 

10.4小结

本章讲述了VisualB开发环境中常用的调试方法和异常处理,通过例子说明了如何使用这些工具调试程序。

通过本章的学习主要掌握断点调试和单步执行;熟悉调试常用的各个窗口,比如局部窗口和监视窗口。

本章还讲述了异常处理,应该在任何时候将这部分内容合并到程序中去。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2