程式執行期間出現異常是一個例外。例外情況是對程式執行時出現的異常情況的回應,例如嘗試除以零。
例外提供了一種將程式的一部分控制權移交給另一部分的方法。VB.Net例外處理基於四個關鍵字:Try
,Catch
,Finally
和Throw
。
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框架中,異常由類表示。.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