VB.NET中Try-Catch結構較傳統的On Error Resume Next優勢何在

VB.NET中Try-Catch結構較傳統的On Error Resume Next優勢何在

VB.NET中支持兩種異常處理機制
一種是傳統的On Error Resume Next
另一中是最新的Try-Catch-Finally結構化異常處理

一般只要談到這兩種機制,大家都會說結構化異常處理會好一些,他是異常處理的首選,但是結構化異常處理與傳統的On Error Resume Next語句相比,其真正的優勢在什麼地方呢?
下面用一段代碼來說明一下:

    if mxDEBUG=1 then        '是否啓用自主錯誤處理
        On Error Resume Next
    end if

    conn.Open ConStr

    If Err.Number = 0 Then
            On Error GoTo 0
            Set GetConnection = conn
        Else
        SqlErrStr= chr(13) & "<br>DBA錯誤:<br>連接字符串:【" & ConStr &  "】<br>" & chr(13)
        ErrStr = ErrStr & "錯誤號:" & Err.number & "(H" & Hex(Err.Number) & ")<br>" & chr(13)
        ErrStr = ErrStr & "錯誤描述:【" & Err.description & "】<br>" & chr(13)
        if not conn.Errors.Count=0 then
            for i=0 to conn.Errors.count-1
                ErrStr = ErrStr & chr(13) & "<br>ADO錯誤號:H" & Hex(conn.Errors(i).Number) & "<br>" & chr(13)
                ErrStr = ErrStr & "ADO錯誤描述:【" & conn.Errors(i).Description & "】<br>" & chr(13)
                ErrStr = ErrStr & "ADO錯誤對象:" & conn.Errors(i).Source & "<br>" & chr(13)
                ErrStr = ErrStr & "ADO_SQLState:" & conn.Errors(i).SQLState & "<br>" & chr(13)
            next
        end if
        On Error GoTo 0
            EF "<br>" & SqlErrStr & ErrStr            '寫入錯誤記錄
        Serr replace(ErrStr,chr(13),"")
        End If

這段asp[VB]代碼是我在一個程序中用來打開數據庫連接的時候進行的錯誤處理,首先我們試着改寫成流行的Try-Catch-Finally結構,呵呵,模擬一下啦

'首先定義一點東西
sub try
    On Error Resume Next
end sub

sub endTry
    if Err.Number = 0 then
        Catch
    else
        OK
    end if
    finally
end sub



'這裏開始進入正題

    Try
        conn.Open ConStr            '可能出錯的行[A]
        Set GetConnection = conn
    endTry

    sub catch
        SqlErrStr= chr(13) & "<br>DBA錯誤:<br>連接字符串:【" & ConStr &  "】<br>" & chr(13)
        ErrStr = ErrStr & "錯誤號:" & Err.number & "(H" & Hex(Err.Number) & ")<br>" & chr(13)
        ErrStr = ErrStr & "錯誤描述:【" & Err.description & "】<br>" & chr(13)
        if not conn.Errors.Count=0 then
            for i=0 to conn.Errors.count-1
                ErrStr = ErrStr & chr(13) & "<br>ADO錯誤號:H" & Hex(conn.Errors(i).Number) & "<br>" & chr(13)
                ErrStr = ErrStr & "ADO錯誤描述:【" & conn.Errors(i).Description & "】<br>" & chr(13)
                ErrStr = ErrStr & "ADO錯誤對象:" & conn.Errors(i).Source & "<br>" & chr(13)
                ErrStr = ErrStr & "ADO_SQLState:" & conn.Errors(i).SQLState & "<br>" & chr(13)
            next
        end if
        On Error GoTo 0
            EF "<br>" & SqlErrStr & ErrStr            '寫入錯誤記錄
        Serr replace(ErrStr,chr(13),"")
    end sub

    sub OK
        '這裏是如果不出錯應該繼續執行的東西
            'Set GetConnection = conn 這一句可以放在這裏   
        On Error GoTo 0
    end sub

    sub finally
        '這裏是不論是否出錯都可以執行的地方
    end sub

上面模擬的異常處理結構在[A]那裏如果出現錯誤,會繼續執行下去,直到執行endTry,而新的Try-Catch結構則在發生異常的時候,直接跳出去找相應的Catch語句去了
在其他方面,兩者的區別僅僅在實現的難易上,這個模擬想達到Try-Catch結構的效果是需要多寫一點代碼的.但是就是這個異常發生之後的一個小細節的不同,使得兩種結構在處理大批量事務的時候表現出了截然不同的特性

假如我們的模擬語句是這樣的
   
    Try
        操作1
        操作2
        操作3
        操作4
        操作5
    endTry

    那我們該如何捕獲錯誤呢?
    很顯然,我們的模擬結構由於在發生錯誤之後仍然繼續執行,可能會導致錯誤處理的延期,使得一些關鍵的錯誤被忽略
    而如果使用Try-Catch結構的話,他會在錯誤發生之後,及時的尋找相應的異常處理代碼
    從而避免了錯誤的蔓延

    那我們想到,傳統的異常處理方法如果想達到這種目的,就需要在每個操作後面放置錯誤檢測代碼,類似於這樣的
    Try
        操作1:T(1)
        操作2:T(2)
        操作3:T(3)
        操作4:T(4)
        操作5:T(5)
    endTry

function T(x)
    select case x
        case 1
            catch(1)
        case 2
            catch(2)
        case 3
            catch(3)
        case 4
            catch(4)
        case 5
            catch(5)
end function

    呵呵,到了這裏,Try-Catch的真正優勢才能體現出來
    也就是說
    Try-Catch結構的優勢體現在一系列相關操作所組成的一個事務的執行過程中的異常處理
    在這樣的情況下,如果還用傳統方式來實現的話,無疑是很麻煩的
    而在其他方面
    比如說
    1.Try-Catch實現了異常處理代碼和正常業務流程的分離
        傳統的On Error Resume Next也是可以實現的
        並且不會比Try-Catch結構麻煩
        所謂的分離,不過是錯誤統一處理罷了
        任何經過精心設計的程序結構都可以實現這種方式的
        這可不是Try-Catch的專利

說了這麼多,無非就是說
並不是一個新方法出來了,老方法就一無是處
並不是一個新方法出來了,就意味着老方法必須退伍了

嘻嘻,不過C++等語言就沒的選擇了,就是Try-Catch
還有一點需要聲明,錯誤和異常不是一回事,雖然在這篇文章中並沒有可以強調
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章