異常是在程序執(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)鍵字完成的。
假設(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 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
您還可以定義自己的異常。 用戶定義的異常類派生自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
如果它是直接或間接從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
更多建議: