Overview
There are two statements that affect error handling in VBScript:
On Error Resume Next On Error Goto 0
The meaning of the first statement is this: if you get an error, ignore it and resume execution on the next statement. As we’ll see, there are some subtleties.
The second statement simply turns off “Resume Next” mode if it is on. The odd syntax is because Visual Basic has an error handling mode which VBScript does not – VB can branch to a labeled or numbered statement.
Discussion
The subtlety in the “Resume Next” mode is best illustrated with an example…
Const InvalidCall = 5 Rhino.Print "Global code start" Blah1 Rhino.Print "Global code end" Sub Blah1() On Error Resume Next Rhino.Print "Blah1 Start" Blah2 Rhino.Print "Blah1 End" End Sub Sub Blah2() Rhino.Print "Blah2 Start" Err.Raise InvalidCall Rhino.Print "Blah2 End" End Sub
This prints out:
Global code start
Blah1 Start
Blah2 Start
Blah1 End
Global code end
When the error ocurred, Blah1 had already turned “Resume Next” mode on. The next statement after the error raise is Print “Blah2 End” but that statement was never executed. This is because the error mode is on a per-procedure basis, not a global basis.
Also, remember that the Next
in “Resume Next” mode is the next statement. Consider these two scripts:
On Error Resume Next Temp = CInt(Foo.Bar(123)) Blah Temp Rhino.Print "Done" On Error Resume Next Blah CInt(Foo.Bar(123)) Rhino.Print "Done"
They do not have the same semantics. If Foo.Bar
raises an error, then the first script passes Empty
to Blah
. The second one never calls Blah
at all if an error is raised, because it resumes to the next statement.
You can get into similar trouble with other constructs. For example, these do have the same semantics:
On Error Resume Next If Blah Then Rhino.Print "Hello" End If Rhino.Print "Goodbye" On Error Resume Next If Blah Then Rhino.Print "Hello" Rhino.Print "Goodbye"
If Blah
raises an error then it resumes on the Rhino.Print "Hello"
in either case.
You can also get into trouble with loops:
On Error Resume Next For index = 1 to Blah Rhino.Print TypeName(index) Next Rhino.Print "Goodbye"
If Blah raises an error, this resumes into the loop, not after the loop. This prints out:
Empty
Goodbye