在VBScript中,與錯誤處理相關的三者:on error resume next, on error goto 0, Err
1、最基本的錯誤提示
dim i
i = 1/0
結果:
Microsoft VBScript 執行階段錯誤 錯誤 '800a000b'
被零除
/try.asp,行 3
2、防止系統的錯誤提示
使用on error resume next,可以放置系統提示錯誤,並且好像什麼都沒有發生一樣,沉默的運行下去
on error resume next
dim i
i = 1/0
運行結果:
空
3、檢查系統的錯誤
使用了on error resume next之後,如果出錯Err對象中將放置最近一次出錯的資訊。Err對象重要的屬性有三個:Number, Source, Description。分別是錯誤號碼,錯誤來源,錯誤描述。你能捕獲的都是執行階段錯誤,而且If Err then這樣的寫法等價於If Err.Number then
on error resume next
dim i
i = 1/0
execute "test"
Response.Write Err.Description
運行結果:
類型不符
可以看到,提示的並不是被零除
4、讓系統重新接管錯誤的處理
on error goto 0 ,使用這條語句會讓系統不再沉默,一旦有錯誤發生就會提示錯誤,並結束指令碼執行。
on error resume next
dim i
i = 1/0
Response.Write "1"
on error goto 0
i = 1/0
Response.Write "2"
運行結果:
1
Microsoft VBScript 執行階段錯誤 錯誤 '800a000b'
被零除
/try.asp,行 7
可以看到,第一個1輸出了,第二個沒有。
5、on error resume next對子程式的影響
先看例子
sub test()
dim i
i = 1/0
Response.Write "ok"
end sub
sub test1()
test
Response.Write "ok"
end sub
on error resume next
test1
運行結果是:
空
兩個ok都沒有被列印。因為on error resume next是在最完成下達的,所以當調用的子程式中出了問題之後,那些子程式後面的部分無權處理,是由最完成的代碼來完成,會直接從子程式中跳出。
6、on error resume next對子程式的影響(2)
還是看例子
sub test()
on error resume next
dim i
i = 1/0
Response.Write " 3 "
end sub
sub test1()
test
Response.Write " 2 "
end sub
on error resume next
test1
Response.Write " 1 "
執行的結果是:
3 2 1
可見在test()中用了on error resume next之後,這個子程式中這條語句之後的錯誤都將自己來處理,但是Err對象在退出了這個函數時並不會被清空,在test1和底層中仍然能夠通過Err對象來知道test()的錯誤的發生。
7、對on error resume next行為的解釋
a、執行了on error resume next之後,在這之後的所有代碼產生的“未寬恕”的錯誤都不會中斷代碼的執行
b、如果沒有執行on error resume next,所有“未寬恕”的錯誤都會導致程式的控制流程程往上層流轉,如果當前是最底層了則由系統列印錯誤。
c、“未寬恕”的錯誤導致流程往上層流轉,如果上層的子程式是在on error resume next之後調用了這個產生錯誤的子函數的,則這個“未寬恕”的錯誤變成了“寬恕”的錯誤,不再影響程式的流程。
d、on error resume next的作用其實是局限於一個子程式中的,它只能保證使用了這個語句之後,在這個子程式內的程式流程不會受到執行階段錯誤的影響。而它並不會影響上層和下層的錯誤處理邏輯。
8、on error goto 0的行為與on error resume next一致,其影響都是局限在子程式內部的。
sub test()
on error goto 0
end sub
on error resume next
test
dim i
i = 1/0
運行結果:
空
可見test()中的on error goto 0並不能把它的影響帶到上層去。
9、Err對象的賦值
Err對象會在執行階段錯誤發生的時候賦予新的值,舊的值會被捨棄。
Err對象不會受到函數調用的影響,它完全是全域的。
Err對象可以用Clear方法清空
任何時候調用on error resume next或者on error goto 0的時候,都會清空Err對象
10、小結
可見這個錯誤處理系統只能勉強用來獲得執行階段錯誤的資訊,個人感覺很不方便,所以很難把程式的錯誤處理基於這樣一個的怪異系統之上。