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