VB.Net例外處理


程式執行期間出現異常是一個例外。例外情況是對程式執行時出現的異常情況的回應,例如嘗試除以零。

例外提供了一種將程式的一部分控制權移交給另一部分的方法。VB.Net例外處理基於四個關鍵字:TryCatchFinallyThrow

  • Try:嘗試塊標識一個程式碼塊,特定的例外將被啟用。緊接著是一個或多個Catch塊。
  • Catch:程式在程式中需要處理問題的地方捕獲異常。Catch關鍵字指示捕獲異常。
  • Finally: Finally塊用於執行一組給定的語句,無論是丟擲異常還是不丟擲異常。例如,如果開啟一個檔案,無論是否引發異常,它都必須關閉。
  • Throw:當出現問題時,程式丟擲異常。這是使用Throw關鍵字完成的。

語法

假設一個塊會引發一個異常,在方法中使用TryCatch關鍵字的組合來捕獲一個異常。 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.ApplicationExceptionSystem.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以trycatch塊的形式為例外處理問題提供了一個結構化的解決方案。使用這些塊將核心程式語句與錯誤處理語句分開。

這些錯誤處理塊是使用TryCatchFinally關鍵字實現的。以下是除零條件發生時丟擲異常的一個例子:

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