異常處理是.NET平臺重要的安全機制,它將錯誤代碼的接受和處理的進行了完美的分離,理清了編程者的思緒,也幫助代碼增強了可讀性,方便了維護者的閱讀和理解,而且還提供了處理程序運行時出現的任何意外或異常情況的方法。在.NET平臺中異常處理使用 try、catch 和 finally 關鍵字來嘗試可能未成功的操作,處理失敗,以及在事後清理資源。異常處理(又稱爲錯誤處理)功能。與傳統VB6.0中的On Error語句相比.NET平臺的異常處理機制更加靈活,而且使用更加方便。
一、異常處理的三個語句塊
.NET平臺中異常處理主要是由try/catch/finally三個語句塊構成,try塊負責錯誤代碼的捕獲,catch進行錯誤的處理,finally負責錯誤處理後的後續工作如:釋放對象、清理資源等的工作。
- Try
- '程序代碼
- Catch
- '處理異常的代碼
- Finally
- '清理工作
- End Try
在上面的語句塊中Try和Finally語句塊是必須運行的,但是Catch語句塊不一定運行,如果Try塊內的代碼沒有錯誤,沒有拋出異常的話,Catch語句塊中的代碼是不運行的,而是跳過Catch塊直接運行Finally塊中的清理工作。反之如果遇到了異常Catch語句塊中的處理工作就要進行。
爲什麼要在Finally塊中進行清理工作?簡單的說一個程序的異常會導致程序不能正常完成結束工作,而且在錯誤出現的地方跳出程序,直接執行Catch語句塊中的代碼,使得在程序運行時構建的對象資源不能釋放,浪費了內存資源,同時也可能導致棧中數據存儲的雜亂,所以無論有沒有出現異常Finally塊中的代碼是一定會運行的。
異常處理的代碼實例:
- Private Sub FirstTryCatchButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FirstTryCatchButton.Click
- Dim sngAvg As Single
- sngAvg = GetAverage(0, 100)
- End Sub
- Private Function GetAverage(ByVal iItems As Integer, ByVal iTotal As Integer) As Single
- ' Code that might throw an exception is wrapped in a Try block
- Try
- Dim sngAverage As Single
- ' This will cause an exception to be thrown if iItems = 0
- sngAverage = CSng(iTotal \ iItems)
- ' This only executes if the line above generated no error
- MessageBox.Show("Calculation successful")
- Return sngAverage
- Catch excGeneric As Exception
- ' If the calculation failed, you get here
- MessageBox.Show("Calculation unsuccessful - exception caught")
- Return 0
- End Try
- End Function
二、拋出異常
我們知道在程序中出現異常會導致提前跳出程序,同樣拋出異常也是跳出程序代碼,直接運行Catch塊中的內容。拋出異常不僅可以應用在程序代碼出現錯誤時,我們還可以使用拋出異常的機制來捕獲一個過程或一個函數中出現異常值的情況,可以把這種方法看做是一個函數返回一個特殊值,通過上層函數來捕獲程序中遇到異常的情況。VB.NET使用Throw關鍵字來在程序中拋出異常,讓調用這個函數的上級調用函數進行處理。
- Private Sub ThrowNewExceptionButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ThrowNewExceptionButton.Click
- Try
- Dim sngAvg As Single
- sngAvg = GetAverage4(0, 100)
- Catch exc As Exception
- MessageBox.Show(exc.Message)
- Finally
- MessageBox.Show("Finally block in click event")
- End Try
- End Sub
- Private Function GetAverage4(ByVal iItems As Integer, ByVal iTotal As Integer) As Single
- If iItems = 0 Then
- Dim excOurOwnException As New ArgumentException("Number of items cannot be zero")
- Throw excOurOwnException
- End If
- End Function