Visual Basic .NET 中的异常处理简介(2)

2008-04-09 04:43:13来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

Catch...When 子句捕捉特定的异常,并允许相关的语句块指导应用程序如何处理。也可以将 Catch...AsCatch...When 子句组合成一条语句,例如:Catch ex As Exception When intResult <> 0。

  如果异常是由资源失败引起的,该子句应该标识此资源,并在可能的情况下提供解决问题的建议或避免出现此问题的提示。如果异常是由编程逻辑失败引起的,该子句应该允许应用程序尽可能安全地退出。如果异常是由用户错误引起的,该子句应该允许用户更正错误并继续进行操作。

  Catch 子句按其在代码中出现的顺序执行。因此,当在整个代码序列中执行时,Catch 子句应该从特定部分移到通用部分。例如,在检查完类型后再检查其基本类型。处理 System.Exception 的 Catch 块应该放置到最后,在处理完所有其他可能的异常之后再执行。

Imports System
Try
  varAvailableSeats = varAuditoriumSeats - varNumberOfGuests
  Catch ex as Exception When varAuditoriumSeats = 0
  MsgBox("观众席没有座位!")
 Exit Sub
  Catch ex as Exception When varAvailableSeats < 0
  MsgBox("没有空余的座位。")
  Exit Sub
  Finally MsgBox("谢谢您对我们的音乐会感兴趣。")
End Try
  Exception 对象

  Exception 对象提供所发生异常的有关信息。每次发生异常时,都将设置 Err 对象的属性,并创建一个新的 Exception 对象实例。查看其属性可以确定代码位置、类型以及异常的起因。

  以下是 Exception 对象的一些常用属性:

  • HelpLink 属性包含一个 URL,指导用户进一步查询该异常的有关信息。
  • Hresult 属性获取或设置分配给异常的数值 HRESULT。HRESULT 是一个 32 位数值,包含三个字段:严重性代码、设备代码和错误代码。严重性代码指示返回的值表示的是信息、警告还是错误。设备代码标识负责异常的系统区域。错误代码是分配给错误的唯一编号。
  • InnerException 属性返回一个异常对象,代表发生异常时正在处理的异常。处理外部异常的代码也许可以使用内部异常的信息,从而更准确地处理外部表达式。
  • Message 属性包含一个字符串,它是一些文本消息,告知用户错误的性质以及处理该错误的最佳方法。创建异常对象时,用户可以提供最适用于特定异常的字符串。如果用户没有提供,将使用默认字符串并根据当前情况进行格式化。
  • Source 属性获取或设置一个字符串,该字符串包含产生异常的对象的名称或发生异常的程序集的名称。
  • StackTrace 属性包含堆栈跟踪,可用于确定代码中发生错误的位置。StackTrace 列出发生异常前已调用的所有方法,以及在源代码中发生调用的行号。
  • TargetSite 属性获取产生当前异常的方法的名称。如果无法获取名称并且堆栈跟踪不是 Nothing,则 TargetSite 属性将从堆栈跟踪获取此方法的名称。
  创建自己的异常用于结构化异常处理

  在 Exception 基类中有两种已定义的异常子类:System.ExceptionApplication.Exception

  System.Exception 是 .NET 框架用于从中派生预定义公共语言运行时异常类的类。当发生非致命错误时,公共语言运行时将产生该异常。System.Exception 不提供有关异常原因的信息。

  注意:有关预定义公共语言运行时异常类的详细信息,请参阅本文末尾的表1,该表列出了预定义的异常类及其起因和派生类。

  可通过从 Application.Exception 类中继承,来创建自己的应用程序异常类。请养成良好的编程习惯,使异常类的名称以单词“Exception”结尾,例如 OutOfMoneyExceptionTooMuchRainException

  以下示例定义了一个异常类,并为其定义了三个构造函数,每个函数使用了不同的参数。

Imports System
Public Class GardenException
 Inherits System.ApplicationException
 Public Sub New()
 End Sub
 ' 为异常创建 Sub New,允许在发生异常时
  ' 设置消息属性。
 Public Sub New(Message As String)
   MyBase.New(Message)
  End Sub
  ' 创建 Sub New,用于在需要包含内部
 ' 异常时使用。
 Public Sub New(Message As String, Inner As Exception)
   MyBase.New(Message)
 End Sub
End Class
注意:将远程功能与用户定义的异常组合使用时,必须确保在远程执行代码时可以获取用户定义异常的元数据,包括在应用程序域之间发生的异常。
  结构化异常处理示例

  此代码示例是一个简单的 Try...Catch 块,它先检查 ArithmeticException,然后检查普通异常。

Imports System
  Sub Main()
   Dim x As Integer = 0
   Try
     Dim y As Integer = 100 / x
   Catch ex As ArithmeticException
     MessageBox.Show(ex.Message)
   Catch ex As Exception
     MsgBox(ex.Message)
   End Try
  End Sub 'Main

  此代码示例是一个与某应用程序相关的 Try...Catch...Finally 块,该应用程序打开一个文件并进行检查。注意,即使 Exit Sub 在代码中位于 Finally 前面,Finally 语句也将执行。

Imports System
  Sub OpenMyFile
   Dim thisFile As Object
   Try
     FileOpen(1, thisFile, OpenMode.Input)
   Catch ex As Exception
     MsgBox (ex.Message)
     Exit Sub
   Finally
     FileClose(1)
   End Try
  End Sub

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:如何用VB.Net创建一个三层的数据库应用程序

下一篇:VB.NET注册表编程