Visual Basic 异常处理

程序执行期间不免会发生错误(异常)。这时我们需要针对错误进行处理,这种行为叫做异常处理。

VB 对异常处理提供了 4 种关键字 - Try, Catch, FinallyThrow

  • TryTry 是一个代码块,程序会针对这个代码块中发生的错误进行捕获。它的后面会紧跟一个或多个 Catch 块。
  • Catch:程序在 Try 中捕获的异常会在这个代码块中进行处理。Catch 关键字指示捕获异常。
  • Finally: Finally 是在无论是否抛出异常的情况下,都会在最后执行的代码块。例如,如果打开一个文件,无论是否引发异常,它都必须关闭。
  • Throw:当出现问题时,程序抛出异常。这是使用 Throw 关键字完成的。

语法

假设一个代码块会引发异常,在方法中使用 TryCatch 关键字的组合来捕获一个异常。 Try/Catch 块放置在可能产生异常的代码周围。Try/Catch 块内的代码被称为受保护的代码(程序不会因为发生错误而中断运行),Try/Catch 的语法如下所示:

  1. Try
  2. [ tryStatements ]
  3. [ Exit Try ]
  4. [ Catch [ exception [ As type ] ] [ When expression ]
  5. [ catchStatements ]
  6. [ Exit Try ] ]
  7. [ Catch ... ]
  8. [ Finally
  9. [ finallyStatements ] ]
  10. End Try
注意:可以列出多个 Catch 语句以捕获不同类型的异常,以防 Try 代码块在不同情况下引发多个异常。

.Net 框架中的异常类(Exception)

在 .Net 框架中,异常由类表示。.Net Framework 中的异常类主要是直接或间接从 System.Exception 类派生的。一些从 System.Exception 类派生的异常类是 System.ApplicationExceptionSystem.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 以 TryCatch 代码块的形式为异常处理问题提供了一个结构化的解决方案。

这些错误处理代码块是使用 TryCatchFinally 关键字实现的。以下是除零时抛出异常的一个例子:

  1. Module exceptionProg
  2. Sub division(ByVal num1 As Integer, ByVal num2 As Integer)
  3. Dim result As Integer
  4. Try
  5. result = num1 \ num2
  6. Catch e As DivideByZeroException
  7. Console.WriteLine("Exception caught: {0}", e)
  8. Finally
  9. Console.WriteLine("Result: {0}", result)
  10. End Try
  11. End Sub
  12. Sub Main()
  13. division(25, 0)
  14. Console.ReadKey()
  15. End Sub
  16. End Module

结果如下:

  1. Exception caught: System.DivideByZeroException: Attempted to divide by zero.
  2. at ...
  3. Result: 0

创建用户自定义的异常

当然 VB 也支持定义自己的异常。用户定义的异常类是从 ApplicationException 类派生的。以下实例演示了如何自定义异常:

  1. Module exceptionProg
  2. Public Class TempIsZeroException : Inherits ApplicationException
  3. Public Sub New(ByVal message As String)
  4. MyBase.New(message)
  5. End Sub
  6. End Class
  7. Public Class Temperature
  8. Dim temperature As Integer = 0
  9. Sub showTemp()
  10. If (temperature = 0) Then
  11. Throw (New TempIsZeroException("Zero Temperature found"))
  12. Else
  13. Console.WriteLine("Temperature: {0}", temperature)
  14. End If
  15. End Sub
  16. End Class
  17. Sub Main()
  18. Dim temp As Temperature = New Temperature()
  19. Try
  20. temp.showTemp()
  21. Catch e As TempIsZeroException
  22. Console.WriteLine("TempIsZeroException: {0}", e.Message)
  23. End Try
  24. Console.ReadKey()
  25. End Sub
  26. End Module

结果如下:

  1. TempIsZeroException: Zero Temperature found

抛出对象

如果从 System.Exception 类直接或间接派生的,则可以抛出一个对象。可以在 Catch 块中使用 Throw 语句来将当前对象引用为:

  1. Throw [ expression ]

下面是一个实例:

  1. Module exceptionProg
  2. Sub Main()
  3. Try
  4. Throw New ApplicationException("A custom exception _ is being thrown here...")
  5. Catch e As Exception
  6. Console.WriteLine(e.Message)
  7. Finally
  8. Console.WriteLine("Now inside the Finally Block")
  9. End Try
  10. Console.ReadKey()
  11. End Sub
  12. End Module

结果如下:

  1. A custom exception is being thrown here...
  2. Now inside the Finally Block