1. 程式人生 > >VBS之on error resume next用法

VBS之on error resume next用法

VBScript語言提供了兩個語句和一個物件來處理"執行時錯誤",如下所示:


On Error Resume Next語句 On Error Goto 0語句 Err物件



簡單介紹一下On Error Resume Next,On Error Goto 0,Err這三者


On Error Resume Next語句和On Error Goto 0語句指明瞭當出現"執行時錯誤"時的處理方式。


當加上On Error Resume Next語句後,如果後面的程式出現"執行時錯誤"時,會繼續執行,不中斷。


當加上On Error Goto 0語句後,如果後面的程式出現"執行時錯誤"時,會顯示"出錯資訊"並停止程式的執行。


Err物件儲存了“錯誤資訊”


下面結合例子講解On Error Resume Next,On Error Goto 0,Err這三者沒有加上On Error Resume Next語句


如果沒有加上On Error Resume Next語句,當出現"執行時錯誤"時,會顯示"出錯資訊"並停止程式的執行.


舉例(/test.asp檔案):



i = 1/0   '0作除數,產生"執行時錯誤",顯示"出錯資訊"並停止程式的執行
Response.Write "除法執行後"   
'這句話將不會執行
%>



結果:


Microsoft VBScript 
執行時錯誤
錯誤 
'800a000b'


被零除


/test.asp,行 2



加上On Error Resume Next語句


當我們在某處加上On Error Resume 
Next這條語句後,隨後的程式即便出現"執行時錯誤"時,也不會顯示"出錯資訊",並且會繼續執行下去.


舉例:



On Error Resume Next   '後面的程式即便出現"執行時錯誤"時,也會繼續執行
i = 1/0   
'0作除數,這是一種"執行時錯誤",但因為有了上面On Error Resume 
Next這句話,所以不會中斷執行,而是會繼續執行下去
Response.Write "除法執行後"   '這句話將會執行
%>



結果:


除法執行後



加上On Error Resume Next語句後,使用Err物件來得到錯誤資訊


使用了On Error Resume Next之後,如果出錯,那麼Err物件中將放置最近一次出錯的資訊。


Err物件重要的屬性有三個:Number, Source, Description。分別是錯誤號,錯誤來源,錯誤描述。


你能捕獲的都是執行時錯誤,而且If Err then這樣的寫法等價於If Err.Number then



Dim i
i = 1/0   '第一個錯誤 
undefined_function "test"   
'第二個錯誤,函式undefined_function未定義 
Response.Write Err.Description


執行結果:


型別不匹配



可以看到,提示的並不是被零除


使用On Error Goto 0 語句,讓系統重新接管錯誤的處理


加上On Error Resume 
Next語句後,後面的程式即便出現"執行時錯誤"時,也會繼續執行.可是如果希望後面的程式出現"執行時錯誤"時停止執行並顯示錯誤,該怎麼做呢?


答案是:使用On Error Goto 0 語句


使用 On Error Goto 0 這條語句後,後面的程式一旦有錯誤發生就會提示錯誤,並結束指令碼執行。



Dim i
i = 1/0
Response.Write "第一個除法執行後"
On Error Goto 0   
'後面的語句一旦有錯誤發生就會提示錯誤,並結束指令碼執行
i = 1/0
Response.Write "第二個除法執行後"


執行結果:


第一個除法執行後


Microsoft VBScript 
執行時錯誤
錯誤 
'800a000b'


被零除


/test.asp,行 2



可以看到,第一個Response.Write執行並輸出了內容,第二個Response.Write沒有執行。


詳細講一下On Error Resume NextOn Error Resume Next語句的作用範圍


On Error Resume Next語句只作用於本級別的後續語句。不會作用於被呼叫的函式或子程式,同樣也不會作用於父級別的程式段


On Error Resume Next語句如果出現在某個函式中,則只對本函式產生影響。對“主調函式”和“被調函式”均沒有影響


一個子程式中如果沒有On Error Resume 
Next語句,那麼當錯誤在子程式中出現時,將會中斷這個子程式的執行,跳轉到呼叫這個子程式的外層程式.如果這個外層程式在“出問題的函式呼叫”之前包含有On 
Error Resume Next語句,則會接著執行“函式呼叫”之後的語句。如果這個外層程式在“出問題的函式呼叫”之前沒有On Error Resume 
Next語句,那麼就跳向外層。這個過程一直重複,直到找到包含有On Error Resume Next語句的環境繼續執行,如果最外層的程式也沒有包含On 
Error Resume Next語句,那麼將會使用預設的錯誤處理器,也就是顯示錯誤資訊並停止執行。


舉例:



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是在最外層下達的,所以當呼叫的子程式中出了問題之後,會直接從子程式中跳出,跳到外層的程式碼中。


如果在子程式的開頭放置一個On Error Resume Next語句,出現的執行期錯誤不會中止這個子程式的執行,。


例如,如果需要向一個檔案中寫入字串,可以通過一個獨立的函式對檔案進行訪問,防止錯誤中斷整個程式的執行:


'returns True if it succeeds, or False on any error
Function 
WriteNewFile(strFileName, strContent)
  On Error Resume Next   'turn off the 
default error handler
  WiteNewFile = Flase   'default return value of 
function
  Set objFSO = CreateObject("scripting.FileSystemObject")
  If 
Err.Number = 0 Then Set objFile = objFSO.CreateTextFile(strFileName,True)
  
If Err.Number = 0 Then objFile.WriteLine strContent
  If Err.Number = 0 Then 
objFile.Close
  If Err.Number = 0 Then WriteNewFile = True
End Function



上面的程式在處理每個程式語句之前,先檢查Err物件的Number屬性。如果值為0(還沒有出現錯誤),那麼就能夠繼續對檔案的建立和寫入過程。如果錯誤發生了,指令碼引擎將設定Err物件的屬性的值,並且繼續處理下一行。


只要不引起錯誤而能正常執行,函式的返回值將設定為“True”。否則函式將返回“False”。


On Error Goto 0語句


在ASP 2.0(儘管沒有文件記錄)和ASP 3.0中,On Error Goto 0語句可以恢復預設的錯誤處理行為。


在執行這個語句後,發生的執行期錯誤將導致預設錯誤處理,在環境鏈中檢查每個巢狀的程式,直到主頁面程式碼。如果沒有其他的環境關閉預設錯誤處理,網頁的執行將停止並顯示IIS預設錯誤網頁。


Err物件


在前面的例子中,關閉預設錯誤處理後,通過檢查Err物件的Number屬性,檢視錯誤是否已經出現。


Err物件儲存了關於執行期錯誤的資訊


下表給出了Err物件提供的屬性。


Description 設定或返回一個描述錯誤的字串
Number (預設屬性)設定或返回指定一個錯誤的值
Source 設定或返回產生錯誤的物件的名稱
使用這些屬性可以檢查發生了哪種錯誤。例如,可以根據錯誤號採取不同的措施,也可以用Source和Description的屬性值為使用者提供錯誤資訊。 

下表給出了Err物件提供的方法。


Clear 清除當前所有的Err物件設定
Raise 產生一個執行期錯誤

使用Err物件生成一個“自定義錯誤”。


可以使用Err物件生成一個“自定義錯誤”。為什麼要做這些呢?因為有時想把一個定製的錯誤訊息傳送給使用者。可以把Err物件的屬性設定成所希望的任何值,然後呼叫Raise方法來產生這種錯誤,這樣做會停止程式的執行,並且把錯誤沿呼叫鏈向回傳遞。


下面的例子顯示了在伺服器磁碟上讀取一個文字檔案時,如何處理錯誤。注意如何使用常數vbObjectError,以確定所選擇的錯誤號不會和一個已存在的錯誤號混淆。通過把任意選擇的錯誤號加到此常數中,就能夠保證和預定義的錯誤不混淆。


  Set objFSO = CreateObject("scripting.FileSystemObject")
  Set objFile = 
objFSO.OpenTextFile("strFileName", ForReading)
  Select Case Err.Number
   
Case 0   'OK, take no action
   Case 50,53   'standard file or path not found 
errors
    'create custom error values and raise error back up the call 
chain
    intErrNumber = vbObjectError + 1073     'custom error number
    
strErrDescription = "The file has been deleted or moved. "
    strErrSource = 
" ReadThisFile function"
    Err.Raise intErrNumber, strErrSource, 
strErrDescription
    Exit Function
   Case Else   'som other error
    
'raise the standard error back up the call chain
    Err.Raise Err.Number, 
Err.Source, Err.Description
    Exit Function
  End Select
  
ReadThisFile = objFile.ReadAll   ' we opened it OK, so return the content
  
objFile.Close
End Function



呼叫這個函式的程式碼可以使用On Error Resume Next語句,並且能捕獲這個函式產生的錯誤。



strContent = ReadThisFile("myfile.txt")
If Err.Number = 0 Then
    
Response.Write "File content is:<br/>" & strContent
Else
    
Response.Write Err.Source & "<br/>" & Err.Description
End 
If