科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件在VB 2005中定制自己的异常

在VB 2005中定制自己的异常

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文在简要分析VB 2005所提供的异常处理机制的同时,详细讨论如何用它所提供的异常类定制自己的异常。

作者:朱先忠编译 来源:天极开发 2007年11月9日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
三、 定制自己的异常

  尽管.NET框架提供了许多标准异常,但你也可以创建,抛出和捕获你自己的定制异常。一般地,微软推荐你使用由.NET框架所提供的标准异常。然而,如果你的应用程序仅使用一个标准异常不能满足需要时,你可以创建一个定制异常。

  当你创建一个定制异常类型时,你就能控制所有的异常属性。你还可以把属性添加到你的定制异常类中。除了把关键数据嵌入到Message属性中外,这可以使你有另外一个地方来存储这些数据。而且,这可以使得检索关键数据非常简单而不必在Message属性外分析它们。

  四、 定制异常示例

  为了理解定制异常,让我们创建一个很简单的命令行应用程序来加以具体说明。

  该代码包含一个非常简单的仅含有一个表Customer的MS Access数据库。一点也不奇怪,这个Customer表包含一组顾客记录(具有CustomerID,first name,last name,address details共四个字段)。该数据库的实际内容并不重要,但是,在你的定制异常中实现数据存取是一种非常合适的选择。

  对于本应用程序来说,我用VB 2005 Express IDE创建了一个新的控制台应用程序。

  五、 DatabaseException基类

  如果你想创建多个定制异常,那么为这些定制异常创建一个定制基类是个不错的主意。这个基类将继承自.NET框架所提供的System.Exception类。它还包含三个构造器-它们几乎可以适用于所有你的定制异常。本文中示例应用程序的基类称作DatabaseException,其代码显示如下:

Public Class DatabaseException
Inherits Exception
Public Sub New()
End Sub
Public Sub New(ByVal message As String)
 MyBase.New(message)
End Sub
Public Sub New(ByVal message As String, ByVal inner As Exception)
 MyBase.New(message, inner)
End Sub
End Class

  这三个构造器都是System.Exception类提供的标准的构造器。第一个允许你创建一个异常而不必使用任何参数-仅需要缺省的异常属性即可。第二个允许你指定一个消息串以用作你的异常的Message属性。最后,第三个构造器也允许你指定一个消息串,但是它允许你指定一个异常作为第二个参数。System.Exception类有一个属性InnerException-当你捕获一个异常并想把它包装到一个关系更相近的异常的内部时,这个属性很有用。通过设置InnerException属性,你可以维持在原始异常中的所有信息。

  有关基类最后一点要注意的是,在从System.Exception类继承还是从System.ApplicationExeption类继承的问题上开发者们的意见并不一致。大多数的微软老用户认为你应该从System.ApplicationException继承,但是也有一些开发者认为应该从System.Exception类继承。我也不确定是否它们之间存在什么技术差距,但是,我对这两种情况均作过测试,它们都能够正常工作。对于本文示例应用程序,我们使用了后面的思想-从System.Exception类中继承。

  六、 定制异常:CustomerNotFoundException

  第一个定制异常类是CustomerNotFoundException。当你试图在你的数据库中查找一个客户但未找到相应的匹配时你会抛出这个异常。实现代码如下所示:

Public Class CustomerNotFoundException
Inherits DatabaseException
Private m_CustomerID As Long
Public ReadOnly Property CustomerID() As Long
Get
 Return m_CustomerID
End Get
End Property
Public Sub New(ByVal customerID As Long)
 MyBase.New("Customer ID was not found.")
 m_CustomerID = customerID
End Sub
End Class

  这个类继承自你前面所创建的DatabaseException基类。它仅包含一个构造器--其参数为customerID。当调用这个构造器时,你把文本串"Customer ID was not found."传递到基类的构造器以用作Message属性。你还有一个已定义的只读属性CustomerID。你将使用这个CustomerID属性来存储要被作为一个参数传递的CustomerID的值。它是一个只读属性,因为把这个值改变为除了引发异常的值以外的值并没有什么意义。
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章