科技行者

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

知识库

知识库 安全导航

至顶网软件频道基础软件Visual Basic .NET 中的异常处理简介

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

  • 扫一扫
    分享文章到微信

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

本文简单介绍了 Visual Basic .NET 中的结构化异常处理和非结构化异常处理。文中包括了各种注意事项......

作者:佚名 来源:Microsoft 2007年11月10日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 结构化异常处理

  结构化异常处理测试特定的代码片段,并在发生异常时改编此异常处理代码,以适应导致该异常的环境。与非结构化异常处理相比,结构化异常处理在大程序中运行得较快,在响应错误时更具灵活性,且具有更高的应用程序可靠性。

  Try...Catch...Finally 控制结构是结构化异常处理的基本结构。它测试代码片段,筛选该代码执行过程中产生的异常,并根据产生的异常类型做出不同的响应。

  Try...Catch...Finally 块

  Try...Catch...Finally 控制结构测试代码片段,并指导应用程序如何处理各种不同类型的错误。在此过程中,该结构的三个组成部分分别扮演着特定的角色。

  • Try 语句提供正在测试异常的代码。
  • Catch 子句标识与特定异常相关联的代码块。Catch When 块指导代码在特定情况下执行。不包含 WhenCatch 子句将响应所有异常。因此,代码中可能包含一系列特定的 Catch...When 语句,每条语句响应特定类型的异常,最后使用通用的 Catch 块来响应前面的 Catch...When 子句未能截取的任何异常。
  • 不管 Try 块中是否发生异常,Finally 语句所包含的代码始终会执行。即使在 Exit TryExit Sub 语句后也会执行 Finally 语句。此代码通常执行清除任务,例如关闭文件或清除缓冲区。
  Catch 子句的用途

  Catch 子句可采用三种格式:CatchCatch...AsCatch...When

  不包含 When 关键字的 Catch 子句允许相关的语句块处理所有异常。Catch...AsCatch...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
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

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

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