VB.Net - 異常處理

2023-01-30 15:52 更新

異常是在程序執(zhí)行期間出現(xiàn)的問(wèn)題。 例外是對(duì)程序運(yùn)行時(shí)出現(xiàn)的異常情況的響應(yīng),例如嘗試除以零。


異常提供了一種將控制從程序的一個(gè)部分轉(zhuǎn)移到另一個(gè)部分的方法。 VB.Net異常處理建立在四個(gè)關(guān)鍵字:Try,Catch,F(xiàn)inally和Throw。

  • Try:  Try塊標(biāo)識(shí)將激活特定異常的代碼塊。 它后面是一個(gè)或多個(gè)Catch塊。

  • Catch:   程序捕獲異常,并在程序中要處理問(wèn)題的位置使用異常處理程序。 Catch關(guān)鍵字表示捕獲異常。

  • Finally: Finally塊用于執(zhí)行給定的一組語(yǔ)句,無(wú)論是拋出還是不拋出異常。 例如,如果打開(kāi)一個(gè)文件,那么無(wú)論是否引發(fā)異常,都必須關(guān)閉該文件。

  • Throw:  當(dāng)出現(xiàn)問(wèn)題時(shí),程序拋出異常。 這是使用Throw關(guān)鍵字完成的。

語(yǔ)法

假設(shè)塊將引發(fā)異常,則方法使用Try和Catch關(guān)鍵字的組合捕獲異常。 Try / Catch塊放置在可能生成異常的代碼周圍。 Try / Catch塊中的代碼稱為受保護(hù)代碼,使用Try / Catch的語(yǔ)法如下所示:

Try
    [ tryStatements ]
    [ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
    [ catchStatements ]
    [ Exit Try ] ]
[ Catch ... ]
[ Finally
    [ finallyStatements ] ]
End Try

您可以列出多個(gè)catch語(yǔ)句以捕獲不同類型的異常,以防您的try塊在不同情況下引發(fā)多個(gè)異常。

.Net框架中的異常類

在.Net框架中,異常由類表示。 .Net Framework中的異常類主要直接或間接從?System.Exception?類派生。 從?System.Exception?類派生的一些異常類是?System.ApplicationException?和?System.SystemException?類。
?System.ApplicationException?類支持由應(yīng)用程序生成的異常。 所以程序員定義的異常應(yīng)該從這個(gè)類派生。
?System.SystemException?類是所有預(yù)定義系統(tǒng)異常的基類。
下表提供了從?Sytem.SystemException?類派生的一些預(yù)定義異常類:

異常類描述
System.IO.IOException處理I / O錯(cuò)誤。
System.IndexOutOfRangeException當(dāng)處理的方法是指一個(gè)數(shù)組索引超出范圍產(chǎn)生的錯(cuò)誤。
System.ArrayTypeMismatchException

處理類型與數(shù)組類型不匹配時(shí)生成的錯(cuò)誤。.

System.NullReferenceException處理從取消引用空對(duì)象生成的錯(cuò)誤。
System.DivideByZeroException處理除零所產(chǎn)生的錯(cuò)誤。
System.InvalidCastException處理類型轉(zhuǎn)換期間生成的錯(cuò)誤。
為System.OutOfMemoryException處理來(lái)自可用內(nèi)存不足產(chǎn)生的錯(cuò)誤。
System.StackOverflowException處理來(lái)自堆棧溢出產(chǎn)生的錯(cuò)誤。

處理異常

VB.Net提供了一個(gè)結(jié)構(gòu)化的解決方案,以try和catch塊的形式處理異常處理問(wèn)題。 使用這些塊,核心程序語(yǔ)句與錯(cuò)誤處理語(yǔ)句分離。

這些錯(cuò)誤處理塊使用Try,Catch和Finally關(guān)鍵字實(shí)現(xiàn)。 以下是在零除條件時(shí)拋出異常的示例:

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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

Exception caught: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Result: 0

創(chuàng)建用戶定義的異常

您還可以定義自己的異常。 用戶定義的異常類派生自ApplicationException類。 以下示例演示了這一點(diǎn):

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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

TempIsZeroException: Zero Temperature found

拋出對(duì)象

如果它是直接或間接從System.Exception類派生的,你可以拋出一個(gè)對(duì)象。

你可以在catch塊中使用throw語(yǔ)句來(lái)拋出當(dāng)前對(duì)象:

Throw [ expression ]

下面的程序說(shuō)明了這一點(diǎn):

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

當(dāng)上述代碼被編譯和執(zhí)行時(shí),它產(chǎn)生了以下結(jié)果:

A custom exception is being thrown here...
Now inside the Finally Block


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)