ASP & VBScript的錯誤處理

來源:互聯網
上載者:User
在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、小結
可見這個錯誤處理系統只能勉強用來獲得執行階段錯誤的資訊,個人感覺很不方便,所以很難把程式的錯誤處理基於這樣一個的怪異系統之上。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.