developer:scriptsamples:errorhandling


Error Handling in RhinoScript

Developer: RhinoScript
Summary: Describes the error handling semantics of VBScript.

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"
</code?
 
If Blah raises an error then it resumes on the Rhino.Print "Hello" in either case.
 
You can also get into trouble with loops:
 
<code vb>
 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


developer/scriptsamples/errorhandling.txt · Last modified: 2010/02/05 16:18 by dale Driven by DokuWiki Recent changes RSS feed

 © 1997-2010 

McNeel North America Europe Latin AmericaAsia