VB.Net – 异常处理
异常是在执行程序期间出现的问题.例外是对程序运行时出现的异常情况的响应,例如尝试除以零.
异常提供了一种从程序的一个部分转移控制的方法到另一个. VB.Net异常处理基于四个关键字 - 尝试, Catch ,最后和投掷.
-
尝试 : Try块标识将激活特定异常的代码块.接下来是一个或多个Catch块.
-
Catch : 程序在您要处理问题的程序中的位置捕获异常处理程序的异常. Catch关键字表示捕获异常.
-
最后 : Finally块用于执行一组给定的语句,无论是抛出还是不抛出异常.例如,如果您打开一个文件,无论是否引发异常,都必须关闭该文件.
-
投掷 : 当问题出现时,程序会抛出异常.这是使用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 Framework中的异常类
在.Net Framework中,异常由类表示. .Net Framework中的异常类主要直接或间接地从 System.Exception 类派生.从System.Exception类派生的一些异常类是 System.ApplicationException 和 System.SystemException 类.
System.ApplicationException 类支持应用程序生成的异常.所以程序员定义的异常应该派生自这个类.
System.SystemException 类是所有预定义系统异常的基类.
下表提供了一些从Sytem.SystemException类派生的预定义异常类 :
| 异常类 | 描述 |
|---|---|
| System.IO.IOException | 处理I/O错误. |
| System.IndexOutOfRangeException | 处理方法引用数组索引超出范围时生成的错误. |
| System.ArrayTypeMismatchException | 处理类型不匹配时生成的错误数组类型. |
| System.NullReferenceException | 处理从引用空对象. |
| System.DivideByZeroException | 处理将被除数除以零所产生的错误. |
| System.InvalidCastException | 处理在类型转换期间生成的错误. |
| System.OutOfMemoryException | 处理因空闲内存不足而产生的错误. |
| System.StackOverflowException | 处理堆栈溢出产生的错误. |
处理异常
VB.Net为异常处理问题提供了一个结构化的解决方案try和catch块的形式.使用这些块,核心程序语句与错误处理语句分开.
这些错误处理块是使用尝试, Catch 和最后关键字.下面是一个例子,当零除条件发生和减去时抛出异常;
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
创建用户定义的例外
你也可以定义自己的例外.用户定义的异常类派生自 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
投掷对象
如果对象直接或间接来自系统,则可以抛出对象.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
里面