異常處理是.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 SubPrivate 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 TryEnd 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 TryEnd SubPrivate 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 IfEnd Function