VB.Net異常處理
程序執行期間出現異常是一個例外。例外情況是對程序運行時出現的異常情況的迴應,例如嘗試除以零。
例外提供了一種將程序的一部分控制權移交給另一部分的方法。VB.Net異常處理基於四個關鍵字:Try
,Catch
,Finally
和Throw
。
- Try:嘗試塊標識一個代碼塊,特定的例外將被激活。緊接着是一個或多個
Catch
塊。 - Catch:程序在程序中需要處理問題的地方捕獲異常。
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框架中的異常類
在.Net框架中,異常由類表示。*.Net Framework* 中的異常類主要是直接或間接從System.Exception
類派生的。一些從System.Exception
類派生的異常類是System.ApplicationException
和System.SystemException
類。
System.ApplicationException
類支持應用程序生成的異常。所以程序員定義的異常應該來自這個類。
System.SystemException
類是所有預定義的系統異常的基類。
下表提供了一些從System.SystemException
類派生的預定義的異常類:
編號
異常類
描述
1
System.IO.IOException
處理I/O
錯誤
2
System.IndexOutOfRangeException
處理方法引用數組索引超出範圍時生成的錯誤。
3
System.ArrayTypeMismatchException
處理類型與數組類型不匹配時產生的錯誤。
4
System.NullReferenceException
處理解引用空對象時產生的錯誤。
5
System.DivideByZeroException
處理將除數除以零產生的錯誤。
6
System.InvalidCastException
處理類型轉換過程中產生的錯誤。
7
System.OutOfMemoryException
處理可用內存不足導致的錯誤。
8
System.StackOverflowException
處理堆棧溢出產生的錯誤。
處理異常
VB.Net以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
創建用戶定義的例外
也可以定義你自己的例外。用戶定義的異常類是從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