2017-02-15 47 views
0

使用On Error Resume Next時,它會跳過遇到的錯誤並移至下一行。 如果我們使用err.Number和err.Description,它會顯示與錯誤相關的消息和編號。 我的問題是:如果它面臨的問題多於錯誤......那麼它將如何顯示?如果我們在使用錯誤恢復時遇到多個錯誤Next

On Error Resume Next 
    intDivideByZero 
    floatDivideByZero 
If err.Number <> 0 Then 
    msgbox "the error number is : " & err.Number 
    msgbox "the error description is : " & err.Description 
End If 
On error Resume 0 
+3

這應該是'對錯誤轉到0'沒有'在錯誤恢復0 ',那會觸發你不期待的語法錯誤。 – Lankymart

回答

3

VBScript錯誤處理相當有限。您需要在發生錯誤的每一行之後放置一個錯誤處理程序。此外,Err對象在出現錯誤後不會自動重置,因此您需要自己執行此操作。否則,對象在下一條語句後仍然會指示錯誤,即使沒有發生任何錯誤。

On Error Resume Next 
intDivideByZero 
If Err Then 
    WScript.Echo "0x" & Hex(Err.Number) & ": " & Err.Description 
    Err.Clear 
End If 
floatDivideByZero 
If Err Then 
    WScript.Echo "0x" & Hex(Err.Number) & ": " & Err.Description 
    Err.Clear 
End If 
On Error Goto 0 

可以簡化,通過每個語句後在程序包處理程序並調用該程序一點點:

Sub Trap 
    If Err Then 
     WScript.Echo "0x" & Hex(Err.Number) & ": " & Err.Description 
     Err.Clear 
    End If 
End Sub 

On Error Resume Next 
intDivideByZero : Trap 
floatDivideByZero : Trap 
On Error Goto 0 
+0

它是不是在錯誤轉到0?另外指定'On Error Goto 0'會將'Err.Number'設置回'0'而不需要'Err.Clear()'。我非常確定,如果你現在運行它會失敗並出現語法錯誤。 – Lankymart

+1

@Lankymart是的。但是該語句位於'floatDivideByZero'之後。在每次錯誤後(即在'intDivideByZero'之後),'Err'需要被清除,否則你可能會得到誤報(例如,在'intDivideByZero'引發錯誤,但'floatDivideByZero'沒有)的情況下。不過,你的語法是正確的。固定。 –

+0

是的,我意識到這一點。我的觀點是聲明「On Error Resume 0」在開始時是錯誤的。關於'Err.Clear()'的觀點只是在你希望檢查錯誤的條件之後直接使用'On Error Goto 0'的好副產品,我並不是建議你在示例代碼中使用它錯了。它的目的更多地是針對這個答案 - *「另外,Err對象在錯誤發生後不會自動重置,所以你需要自己去做。」*。 – Lankymart