扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:佚名 来源:Microsoft 2007年11月10日
关键字:
结构化异常处理测试特定的代码片段,并在发生异常时改编此异常处理代码,以适应导致该异常的环境。与非结构化异常处理相比,结构化异常处理在大程序中运行得较快,在响应错误时更具灵活性,且具有更高的应用程序可靠性。
Try...Catch...Finally 控制结构是结构化异常处理的基本结构。它测试代码片段,筛选该代码执行过程中产生的异常,并根据产生的异常类型做出不同的响应。
Try...Catch...Finally 块Try...Catch...Finally 控制结构测试代码片段,并指导应用程序如何处理各种不同类型的错误。在此过程中,该结构的三个组成部分分别扮演着特定的角色。
Catch 子句可采用三种格式:Catch、Catch...As 和 Catch...When。
不包含 When 关键字的 Catch 子句允许相关的语句块处理所有异常。Catch...As 和 Catch...When 子句捕捉特定的异常,并允许相关的语句块指导应用程序如何处理。也可以将 Catch...As 和 Catch...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 对象提供所发生异常的有关信息。每次发生异常时,都将设置 Err 对象的属性,并创建一个新的 Exception 对象实例。查看其属性可以确定代码位置、类型以及异常的起因。
以下是 Exception 对象的一些常用属性:
在 Exception 基类中有两种已定义的异常子类:System.Exception 和 Application.Exception。
System.Exception 是 .NET 框架用于从中派生预定义公共语言运行时异常类的类。当发生非致命错误时,公共语言运行时将产生该异常。System.Exception 不提供有关异常原因的信息。
注意:有关预定义公共语言运行时异常类的详细信息,请参阅本文末尾的表1,该表列出了预定义的异常类及其起因和派生类。 可通过从 Application.Exception 类中继承,来创建自己的应用程序异常类。请养成良好的编程习惯,使异常类的名称以单词“Exception”结尾,例如 OutOfMoneyException 或 TooMuchRainException。
以下示例定义了一个异常类,并为其定义了三个构造函数,每个函数使用了不同的参数。
| 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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。