异常是在执行程序期间出现的问题.例外是对程序运行时出现的异常情况的响应,例如尝试除以零.
异常提供了一种从程序的一个部分转移控制的方法到另一个. 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中的异常类主要直接或间接地从 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
里面