Visual Basic 异常处理
程序执行期间不免会发生错误(异常)。这时我们需要针对错误进行处理,这种行为叫做异常处理。
VB 对异常处理提供了 4 种关键字 - Try, Catch, Finally 和 Throw。
- Try:
Try是一个代码块,程序会针对这个代码块中发生的错误进行捕获。它的后面会紧跟一个或多个Catch块。 - Catch:程序在
Try中捕获的异常会在这个代码块中进行处理。Catch关键字指示捕获异常。 - Finally:
Finally是在无论是否抛出异常的情况下,都会在最后执行的代码块。例如,如果打开一个文件,无论是否引发异常,它都必须关闭。 - Throw:当出现问题时,程序抛出异常。这是使用
Throw关键字完成的。
语法
假设一个代码块会引发异常,在方法中使用 Try 和 Catch 关键字的组合来捕获一个异常。 Try/Catch 块放置在可能产生异常的代码周围。Try/Catch 块内的代码被称为受保护的代码(程序不会因为发生错误而中断运行),Try/Catch 的语法如下所示:
Try[ tryStatements ][ Exit Try ][ Catch [ exception [ As type ] ] [ When expression ][ catchStatements ][ Exit Try ] ][ Catch ... ][ Finally[ finallyStatements ] ]End Try
Catch 语句以捕获不同类型的异常,以防 Try 代码块在不同情况下引发多个异常。.Net 框架中的异常类(Exception)
在 .Net 框架中,异常由类表示。.Net Framework 中的异常类主要是直接或间接从 System.Exception 类派生的。一些从 System.Exception 类派生的异常类是 System.ApplicationException 和 System.SystemException 类。
System.ApplicationException 类支持应用程序生成的异常。所以程序员定义的异常应该派生自这个类。
System.SystemException 类是所有预定义的系统异常的基类。
下表提供了一些从 System.SystemException 类派生的预定义的异常类:
| 异常类 | 描述 |
|---|---|
| System.IO.IOException | 处理 I/O 错误。 |
| System.IndexOutOfRangeException | 处理引用数组索引超出范围时产生的错误。 |
| System.ArrayTypeMismatchException | 处理类型与数组类型不匹配时产生的错误。 |
| System.NullReferenceException | 处理解引用空对象时产生的错误。 |
| System.DivideByZeroException | 处理将除数除以零产生的错误。 |
| System.InvalidCastException | 处理类型转换过程中产生的错误。 |
| System.OutOfMemoryException | 处理可用内存不足导致的错误。 |
| System.StackOverflowException | 处理堆栈溢出产生的错误。 |
处理异常
VB 以 Try 和 Catch 代码块的形式为异常处理问题提供了一个结构化的解决方案。
这些错误处理代码块是使用 Try,Catch 和 Finally 关键字实现的。以下是除零时抛出异常的一个例子:
Module exceptionProgSub division(ByVal num1 As Integer, ByVal num2 As Integer)Dim result As IntegerTryresult = num1 \ num2Catch e As DivideByZeroExceptionConsole.WriteLine("Exception caught: {0}", e)FinallyConsole.WriteLine("Result: {0}", result)End TryEnd SubSub Main()division(25, 0)Console.ReadKey()End SubEnd Module
结果如下:
Exception caught: System.DivideByZeroException: Attempted to divide by zero.at ...Result: 0
创建用户自定义的异常
当然 VB 也支持定义自己的异常。用户定义的异常类是从 ApplicationException 类派生的。以下实例演示了如何自定义异常:
Module exceptionProgPublic Class TempIsZeroException : Inherits ApplicationExceptionPublic Sub New(ByVal message As String)MyBase.New(message)End SubEnd ClassPublic Class TemperatureDim temperature As Integer = 0Sub showTemp()If (temperature = 0) ThenThrow (New TempIsZeroException("Zero Temperature found"))ElseConsole.WriteLine("Temperature: {0}", temperature)End IfEnd SubEnd ClassSub Main()Dim temp As Temperature = New Temperature()Trytemp.showTemp()Catch e As TempIsZeroExceptionConsole.WriteLine("TempIsZeroException: {0}", e.Message)End TryConsole.ReadKey()End SubEnd Module
结果如下:
TempIsZeroException: Zero Temperature found
抛出对象
如果从 System.Exception 类直接或间接派生的,则可以抛出一个对象。可以在 Catch 块中使用 Throw 语句来将当前对象引用为:
Throw [ expression ]
下面是一个实例:
Module exceptionProgSub Main()TryThrow New ApplicationException("A custom exception _ is being thrown here...")Catch e As ExceptionConsole.WriteLine(e.Message)FinallyConsole.WriteLine("Now inside the Finally Block")End TryConsole.ReadKey()End SubEnd Module
结果如下:
A custom exception is being thrown here...Now inside the Finally Block