Another form of the On Error statement is On Error Resume Next. This alternative
is used to handle an error immediately after the line causing the error rather
than branching to a specified error handler. Another use of On Error Resume Next
is to simply allow your application to ignore errors that you don't need to handle
at all.
In Listing 11.1, you can assume that the GetObject function might cause a runtime
error. Notice that this code attempts to handle the error on the following line
by first evaluating the current value of Err.Number.
LISTING 11.1
THE ON ERROR RESUME NEXT STATEMENT ALLOWS US TO HANDLE ERRORS
AS THEY OCCUR
Private Sub XLInLine()
Dim errTemp As Long
On Error Resume Next
Set xl = GetObject(, "Excel.Application")
Select Case Err.Number
Case 0
MsgBox "Successfully Opened
Excel"
Case 429
Set xl = CreateObject("Excel.Application")
Case Else
MsgBox "Fatal error #" &
Err.Number _
& " (" & Err.Description
& ")" & _
": Passing the buck"
End
End Select
Err.Clear
End Sub
The example also checks to see if the value of Err.Number is 0, which indicates
that no error has occurred.
Notice that the Err object's Clear method is called after the Select Case structure
handles the error. You need to call Err.Clear because inline error handling doesn't
use the Resume statement, and Resume is what you normally rely on to reset the
Err object. If an error had occurred in the code in Listing 11.1 and Err.Clear
hadn't been used, the Err object would continue to store information about this
error.
This could mislead a called procedure, which might have its own error handlers
and would depend on the value of Err.Number to function properly.
Remember to call Err.Clear after each place where, in a routine where you handle
inline errors, an error could occur in any of these locations, and you must handle
each one individually. Generally, you'll want to be careful about using inline
error handling. Your procedures can get quite long and more difficult to construct
and maintain since an error handler must follow each line that could cause an
error.
As we mentioned previously, the On Error Resume Next statement is used for
inline error handling. There are other times, however, when the On Error Resume
Next statement comes in handy. There are basically two uses for On Error Resume
Next:
- Ignore errors and keep on processing. This is useful when you might expect
an error to occur occasionally, but the error does not affect the remaining code.
For example, the code in Listing 11.2 will process all the controls on the current
form.
LISTING 11.2
USING ON ERROR RESUME NEXT TO IGNORE UNIMPORTANT ERRORS
On Error Resume Next
For each ctrlCurr In Controls
ctrlCurr.Text = UCase(ctrlCurr.Text)
Next ctrlCurr
-
Whenever the loop hits a control without a Text property, such as a Label,
VB generates a runtime error. In Listing 11.2, the error is not relevant and does
not require handling because you want VB to simply ignore any control that does
not apply (controls without a text property). The On Error Resume Next statement
tells the system to ignore the error and keep going.
-
Process errors immediately after they occur. This is possible because VB sets
the values of Err.Number and Err.Description when an error occurs even if On Error
Resume Next is in effect. This enables you to use a second style of local error
trapping— inline error handling—as previously discussed in this section.
Inline error handling therefore offers you an alternative, and often less cumbersome,
way to process errors in a routine.