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 exceptionProg
Sub division(ByVal num1 As Integer, ByVal num2 As Integer)
Dim result As Integer
Try
result = num1 \ num2
Catch e As DivideByZeroException
Console.WriteLine("Exception caught: {0}", e)
Finally
Console.WriteLine("Result: {0}", result)
End Try
End Sub
Sub Main()
division(25, 0)
Console.ReadKey()
End Sub
End Module
结果如下:
Exception caught: System.DivideByZeroException: Attempted to divide by zero.
at ...
Result: 0
创建用户自定义的异常
当然 VB 也支持定义自己的异常。用户定义的异常类是从 ApplicationException
类派生的。以下实例演示了如何自定义异常:
Module exceptionProg
Public Class TempIsZeroException : Inherits ApplicationException
Public Sub New(ByVal message As String)
MyBase.New(message)
End Sub
End Class
Public Class Temperature
Dim temperature As Integer = 0
Sub showTemp()
If (temperature = 0) Then
Throw (New TempIsZeroException("Zero Temperature found"))
Else
Console.WriteLine("Temperature: {0}", temperature)
End If
End Sub
End Class
Sub Main()
Dim temp As Temperature = New Temperature()
Try
temp.showTemp()
Catch e As TempIsZeroException
Console.WriteLine("TempIsZeroException: {0}", e.Message)
End Try
Console.ReadKey()
End Sub
End Module
结果如下:
TempIsZeroException: Zero Temperature found
抛出对象
如果从 System.Exception
类直接或间接派生的,则可以抛出一个对象。可以在 Catch
块中使用 Throw
语句来将当前对象引用为:
Throw [ expression ]
下面是一个实例:
Module exceptionProg
Sub Main()
Try
Throw New ApplicationException("A custom exception _ is being thrown here...")
Catch e As Exception
Console.WriteLine(e.Message)
Finally
Console.WriteLine("Now inside the Finally Block")
End Try
Console.ReadKey()
End Sub
End Module
结果如下:
A custom exception is being thrown here...
Now inside the Finally Block