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
還有一點需要聲明,錯誤和異常不是一回事,雖然在這篇文章中並沒有可以強調
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
還有一點需要聲明,錯誤和異常不是一回事,雖然在這篇文章中並沒有可以強調
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.