论文部分内容阅读
摘要:本文主要探讨了VB.NET中错误与异常的概念,结合Error对象和Exception对象的使用描述常用的异常处理技术,并结合VB.NET程序代码对非结构化和结构化异常处理进行比较总结。
关键词:VB.NET;程序错误与异常;异常处理技术
1. 错误与异常概述
在使用VB.NET开发程序软件的过程中,随着程序代码的增长,在程序中不可避免地会产生一些错误,这些错误一般可以分为三类:语法错误、逻辑错误和运行时错误。
(1)语法错误:这类错误最容易发现,VS.NET会在包含错误的代码下面使用波浪线标志错误,提示程序员语法错误发生的地点,并给出错误原因的相关信息,而且错误信息会在“任务列表”窗口中显示出来。
(2)逻辑错误:这类错误是指程序运行正常但产生的结果却和预期的不一样。这类错误往往是由于程序员的逻辑思维混淆所导致的。
(3)运行时错误:这类错误往往是程序试图执行的操作由于某些原因不可能被执行,例如当用户试图去打开一个不存在的文件,或者试图去将一个字符类型的数据输入到数据库中一个非字符类型的字段中。
上述错误是指在程序执行代码过程中发生的事件,在NET框架中错误的产生将中断程序代码的正常流程,并创建一个异常对象来表示这个错误。当错误中断程序流程时,该程序将尝试寻找异常处理程序(一段告诉程序如何对错误做出响应的代码),以帮助程序恢复流程。从这里可以看出:错误是一个事件,而异常是该事件创建的对象;在异常产生时,异常处理程序能捕获异常并进行相应的操作,以增加程序运行的稳定性和可靠性。
在VB.NET中有两种异常处理技术:第一种是非结构化异常处理技术,它是早期VB版本中的异常处理技术,在非结构化异常处理中,代码开始处的On Error 语句将处理所有的异常。第二种是结构化异常处理技术,类似于C#中的异常处理方式,它使用包含异常、单独的代码块和筛选器的控制结构创建异常处理机制。它使代码可以区分不同的错误类别,并根据相应的情况做出响应。与非结构化异常处理技术相比,结构化异常处理技术更强大,更具普遍性和灵活性。
2. 异常处理的方法
(1)非结构化异常处理。非结构化异常处理主要通过Err对象和以下语句来实现:On Error、Resume 和Err对象。On Error 语句用于创建单个异常处理程序以捕捉发生的所有异常,但一次只能有一个处理程序。此方法可以跟踪最近产生的异常和最近的异常处理程序的位置。在On Error开始时,Err对象被设置为Nothing。在程序运行过程中产生错误时Err对象被赋值,如果有多个错误产生,Err对象属性的值仅由刚刚发生的错误决定。每次在错误处理例程中发生Exit Sub、Exit Function、Exit Property、Resume 或Resume Next 语句时,Err 对象的属性都将重置为零或零长度字符串。而在错误处理例程外部使用上述任何语句都不会重置其属性。如果确实需要重置属性,可以使用Clear方法重置Err对象。
(2)结构化异常处理。在VB.NET中使用Try、Catch、Finally关键字提供结构化异常处理功能。在Try代码块中包含可能产生异常的代码段,它还可以和一个或多个Catch子句配合使用。这些Catch子句主要用来过滤异常并将它们和对应异常处理代码建立关联。最后无论在Try代码块中是否发生异常,Finally 语句所包含的代码始终会被执行,即使在Exit Try语句后也会执行Finally语句。Finally语句块通常执行清除任务,例如文件的关闭或解除对数据库中表的锁定等。
Catch子句可以采用三种格式:Catch、Catch...As 和Catch...When。Catch...As 和Catch...When 子句用于捕获特定的异常,并在后面的语句块中进行异常处理。VB.NET按照Catch...As(When)子句的顺序把当前捕获的异常类型和Catch...As(When)子句中列出的所有异常逐一进行比较,直到找到一个相匹配的。如果在所有的Catch...As(When)子句中没有找到匹配的异常类型,最后将执行不包含as(When)的Catch子句。也就是说最后这个Catch子句可以捕获所有的异常。需要注意的是:当使用多个Catch...As(When)子句捕获异常时,所有的Catch...As(When)子句都是按出现的先后顺序依次进行匹配,所以应该根据异常对象的层次结构,将低级别的异常放在Catch...As(When)子句的最前面,然后才是通用的异常,最后是不包含as(When)的Catch子句。
(3)创建自定义的异常。在VB.NET中可以通过从Application.Exception类中继承,来创建自己的应用程序异常类。建议异常类的名称以Exception结尾。
3. 非结构化和结构化异常处理技术对比
在使用非结构化异常技术处理异常时,可能产生程序代码执行的跳转,而且在非结构化异常处理中使用Err对象仅能获得最近产生的错误信息,但代码在执行过程中可能不只产生一处错误,从而使得已经发生的错误信息丢失。结构化异常处理技术采用Try...Catch...Finally控制结构作为结构化异常处理的基本结构,在处理异常时不会产生跳转。而且可以根据所产生的异常类型的不同分别做出不同的处理。通常情况下,结构化异常处理技术提供了能够更加灵活地处理错误的功能,在实际中得到广泛应用。但在少数情况下仍然可能需要使用非结构化异常处理。
从上述对结构化和非结构化异常处理技术的描述,可以看出,结构化异常处理的功能比非结构化异常处理的功能更强大。需要注意的是由于抛出和捕获异常会增加应用程序的负荷,因此,在确保异常得到处理的同时,不要过多地列举异常,否则会导致程序性能下降。另外当可以肯定地知道代码在此处会出现什么错误时可以使用if...else...进行处理。例如:检测用户输入数据的类型等。在不能确定程序代码会在什么位置出现什么类型的错误时,使用Try...Catch可以对错误进行有效地处理,提高程序的健壮性。例如:I/O操作等。
参考文献:
[1] Microsoft.VB.NET程序设计语言【M】.高等教育出版社,2003.
[2] Fred Barwell VB.NET高级编程.清华大学出版社,2002.
关键词:VB.NET;程序错误与异常;异常处理技术
1. 错误与异常概述
在使用VB.NET开发程序软件的过程中,随着程序代码的增长,在程序中不可避免地会产生一些错误,这些错误一般可以分为三类:语法错误、逻辑错误和运行时错误。
(1)语法错误:这类错误最容易发现,VS.NET会在包含错误的代码下面使用波浪线标志错误,提示程序员语法错误发生的地点,并给出错误原因的相关信息,而且错误信息会在“任务列表”窗口中显示出来。
(2)逻辑错误:这类错误是指程序运行正常但产生的结果却和预期的不一样。这类错误往往是由于程序员的逻辑思维混淆所导致的。
(3)运行时错误:这类错误往往是程序试图执行的操作由于某些原因不可能被执行,例如当用户试图去打开一个不存在的文件,或者试图去将一个字符类型的数据输入到数据库中一个非字符类型的字段中。
上述错误是指在程序执行代码过程中发生的事件,在NET框架中错误的产生将中断程序代码的正常流程,并创建一个异常对象来表示这个错误。当错误中断程序流程时,该程序将尝试寻找异常处理程序(一段告诉程序如何对错误做出响应的代码),以帮助程序恢复流程。从这里可以看出:错误是一个事件,而异常是该事件创建的对象;在异常产生时,异常处理程序能捕获异常并进行相应的操作,以增加程序运行的稳定性和可靠性。
在VB.NET中有两种异常处理技术:第一种是非结构化异常处理技术,它是早期VB版本中的异常处理技术,在非结构化异常处理中,代码开始处的On Error 语句将处理所有的异常。第二种是结构化异常处理技术,类似于C#中的异常处理方式,它使用包含异常、单独的代码块和筛选器的控制结构创建异常处理机制。它使代码可以区分不同的错误类别,并根据相应的情况做出响应。与非结构化异常处理技术相比,结构化异常处理技术更强大,更具普遍性和灵活性。
2. 异常处理的方法
(1)非结构化异常处理。非结构化异常处理主要通过Err对象和以下语句来实现:On Error、Resume 和Err对象。On Error 语句用于创建单个异常处理程序以捕捉发生的所有异常,但一次只能有一个处理程序。此方法可以跟踪最近产生的异常和最近的异常处理程序的位置。在On Error开始时,Err对象被设置为Nothing。在程序运行过程中产生错误时Err对象被赋值,如果有多个错误产生,Err对象属性的值仅由刚刚发生的错误决定。每次在错误处理例程中发生Exit Sub、Exit Function、Exit Property、Resume 或Resume Next 语句时,Err 对象的属性都将重置为零或零长度字符串。而在错误处理例程外部使用上述任何语句都不会重置其属性。如果确实需要重置属性,可以使用Clear方法重置Err对象。
(2)结构化异常处理。在VB.NET中使用Try、Catch、Finally关键字提供结构化异常处理功能。在Try代码块中包含可能产生异常的代码段,它还可以和一个或多个Catch子句配合使用。这些Catch子句主要用来过滤异常并将它们和对应异常处理代码建立关联。最后无论在Try代码块中是否发生异常,Finally 语句所包含的代码始终会被执行,即使在Exit Try语句后也会执行Finally语句。Finally语句块通常执行清除任务,例如文件的关闭或解除对数据库中表的锁定等。
Catch子句可以采用三种格式:Catch、Catch...As 和Catch...When。Catch...As 和Catch...When 子句用于捕获特定的异常,并在后面的语句块中进行异常处理。VB.NET按照Catch...As(When)子句的顺序把当前捕获的异常类型和Catch...As(When)子句中列出的所有异常逐一进行比较,直到找到一个相匹配的。如果在所有的Catch...As(When)子句中没有找到匹配的异常类型,最后将执行不包含as(When)的Catch子句。也就是说最后这个Catch子句可以捕获所有的异常。需要注意的是:当使用多个Catch...As(When)子句捕获异常时,所有的Catch...As(When)子句都是按出现的先后顺序依次进行匹配,所以应该根据异常对象的层次结构,将低级别的异常放在Catch...As(When)子句的最前面,然后才是通用的异常,最后是不包含as(When)的Catch子句。
(3)创建自定义的异常。在VB.NET中可以通过从Application.Exception类中继承,来创建自己的应用程序异常类。建议异常类的名称以Exception结尾。
3. 非结构化和结构化异常处理技术对比
在使用非结构化异常技术处理异常时,可能产生程序代码执行的跳转,而且在非结构化异常处理中使用Err对象仅能获得最近产生的错误信息,但代码在执行过程中可能不只产生一处错误,从而使得已经发生的错误信息丢失。结构化异常处理技术采用Try...Catch...Finally控制结构作为结构化异常处理的基本结构,在处理异常时不会产生跳转。而且可以根据所产生的异常类型的不同分别做出不同的处理。通常情况下,结构化异常处理技术提供了能够更加灵活地处理错误的功能,在实际中得到广泛应用。但在少数情况下仍然可能需要使用非结构化异常处理。
从上述对结构化和非结构化异常处理技术的描述,可以看出,结构化异常处理的功能比非结构化异常处理的功能更强大。需要注意的是由于抛出和捕获异常会增加应用程序的负荷,因此,在确保异常得到处理的同时,不要过多地列举异常,否则会导致程序性能下降。另外当可以肯定地知道代码在此处会出现什么错误时可以使用if...else...进行处理。例如:检测用户输入数据的类型等。在不能确定程序代码会在什么位置出现什么类型的错误时,使用Try...Catch可以对错误进行有效地处理,提高程序的健壮性。例如:I/O操作等。
参考文献:
[1] Microsoft.VB.NET程序设计语言【M】.高等教育出版社,2003.
[2] Fred Barwell VB.NET高级编程.清华大学出版社,2002.