VB.Net - 異常處理



異常是在程式執行期間出現的錯誤。異常是對程式執行期間出現的異常情況的響應,例如嘗試除以零。

異常提供了一種將控制權從程式的一部分轉移到另一部分的方法。VB.Net 異常處理基於四個關鍵字——TryCatchFinallyThrow

  • Try − 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

如果您的 try 塊在不同情況下引發多個異常,則可以列出多個 catch 語句以捕獲不同型別的異常。

.Net Framework 中的異常類

在 .Net Framework 中,異常由類表示。.Net Framework 中的異常類主要直接或間接地派生自System.Exception 類。一些從 System.Exception 類派生的異常類是System.ApplicationExceptionSystem.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 塊的形式提供了一種結構化的異常處理解決方案。使用這些塊,核心程式語句與錯誤處理語句分開。

這些錯誤處理塊使用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
廣告