提要 本文在简要分析VB 2005所提供的异常处理机制的同时,详细讨论如何用它所提供的异常类定制自己的异常。
结构化异常处理是随着.net的第一个版本的发行而加入到Visual Basic语言中的。结构化异常处理的重要性基于下面两个原因:
1. 与以前的On Error Goto...语句相比而言,通过使用一种与该语言其它部分更适应的语法从而使得代码更具有可读性。
2. 比以前的On Error Goto...语句功能更强,而且提供了更为灵活性的控制能力。
一、 捕获并抛出异常
异常处理是用Try...Catch...Finally...End Try语句实现的,其基本语法形式如下:
Try
'能够引发一个异常的代码
Catch
'处理异常的代码
Finally
'实现清理工作的代码(如关闭数据库连接,等等)
End Try
Try和End Try语句都是必需的。Catch和Finally语句可以共同使用于一个Try块中,但是至少使用其中之一。而且,可以使用多个Catch语句来处理不同类型的异常。如果你有多个Catch块,可以对它们加以排序:从最具体的异常类型到最粗略的异常类型:
Try
'能够引发一个异常的代码
Catch ex As ArgumentOutOfRangeException
'有可能使用一个缺省值来处理一个无效参数以便使代码继续执行
Catch ex As Exception
'处理任何其它类型的异常
Finally
'实现清理工作的代码(如关闭数据库连接,等等)
End Try
你也可以在你的代码中抛出异常。当你在代码中执行一些清理工作时,捕获并抛出异常是很有用的-这样以来,一个更高层级的过程可以捕获它。当你创建定制异常类型时,抛出异常也很有用。
为了抛出一个异常,你可以编写如下形式的代码:
Throw New ArgumentOutOfRangeException
ArgumentOutOfRangeException告诉Throw语句要抛出什么类型的异常。这个ArgumentOutOfRangeException类型仅是.NET框架所提供的众多的类型之一。
二、 传播异常
当一个异常出现于你的代码的某处时,你可以以三种方式传播它:
·什么也不做而让它自动地传播回调用栈(由系统自动处理)。
·捕获并再次抛出它。这可以允许你在Finally块中运行一些清理代码。
·捕获它,并使用InnerException属性在另一个异常中包装该异常,并且把这个新的异常抛回调用过程。这个InnerException属性可以让你维持原始的异常并在一个关系更为密切的异常中存放它的信息
三、 定制自己的异常
尽管.net框架提供了许多标准异常,但你也可以创建,抛出和捕获你自己的定制异常。一般地,微软推荐你使用由.NET框架所提供的标准异常。然而,如果你的应用程序仅使用一个标准异常不能满足需要时,你可以创建一个定制异常。
当你创建一个定制异常类型时,你就能控制所有的异常属性。你还可以把属性添加到你的定制异常类中。除了把关键数据嵌入到Message属性中外,这可以使你有另外一个地方来存储这些数据。而且,这可以使得检索关键数据非常简单而不必在Message属性外分析它们。
