Error Trapping
As you are writing your code, Visual Basic informs you of syntactical errors.
However, once the program is running, you may encounter unexpected runtime errors in many circumstances.
For example, suppose you try to open a text file that the user has deleted.
When a compiled program has an error like this, an error message is displayed and the program ends.
Although you cannot predict and write code for every possible type of error,
"File Not Found" errors are fairly easy to handle. If you do not write code to work around the error, you can at least provide a message that makes
more sense before ending the program.
The "On Error" Statement
The most common way to handle error conditions is to use Visual Basic's "On
Error" statement. The "On Error" statement interrupts the normal flow of your program when
an error occurs and begins executing your error handling code. A typical
use is as follows :
On Error Goto FileOpenError
When this statement is executed, any errors that occur in subsequent statements cause Visual Basic to stop normal line-by-line execution and jump to the statement labeled as
"FileOpenError".
Labeling Code Lines
Line labels in Visual Basic are similar to the line numbers of early BASIC. In Visual Basic, line labels can include text if you want, but each label must be unique. They are followed by a colon (:), as in the following example :
Private Sub Form_Load ()
On Error Goto FileOpenError
Open "C:\SOMEFILE.TXT" For Unput As #1
Line Input #1, sData
Exit Sub
FileOpenError:
MsgBox "There was a problem opening the file. Stop for coffee!"
End
End Sub
In the preceding sample code, if the "Open" or "Line
Input" statements cause an error, the statements starting at the label
"FileOpenError" are executed, causing the message to be displayed and ending the program.
You should note a few points about the sample code. First, note the location and style of the error handling routine. It is usually placed near the end of the subroutine, with the label not indented to indicate a special section of code.
Second, and more important, note the "Exit Sub" statement after the
"Open"
statement. It is necessary to prevent the error handler routine from executing even when the
"Open" statement was successful.
Controlling Program Flow After an Error
In the preceding code example, you simply end the program if an error occurs.
However, you can handle the error in several (better) ways :
- Exit the subroutine after informing the user of the error, and allow the program
to continue running with limited functionality.
- Resume execution with the next statement following the error.
- Provide a way for the user to correct the error and retry the offending statement.
You can also have multiple labels within a procedure and set the current error handler
multiple times. For example, you can add a line to the code sample after the
"Open"
statement that specifies a new label, "FileInputError". You can also turn off error
handling with the following statement :
On Error Goto 0
The "On Error" statement goes hand in hand with the
"Resume" statement. For example,
this statement causes errors to be ignored and the program to proceed through each line
of the code anyway :
On Error Resume Next
You should use the preceding line of code sparingly because it really just ignores
errors rather than handles them. A better use of "Resume" is to go to another section
of code. as in the following example :
Private Sub Form_Load ()
On Error Goto FileOpenError
RetryHere:
Open "C:\SOMEFILE.TXT" For Unput As #1
Line Input #1, sData
Exit Sub
FileOpenError:
Dim sMessage As String
sMessage = "There was a problem opening the file. " & VbCrLf
sMessage = sMessage & "Press Retry to try again, or Cancel to quit."
If MsgBox (sMessage, vbRetryCancel + vbCritical, "Error!") = vbRetry Then
Resume RetryHere
Else
End
End If
End Sub
You can though use "On Error Resume Next" if you are trying to connect to AutoCAD
from an external Visual Basic or other application :
'if error carry on with next line
On Error Resume Next
'set reference to AutoCAD Application
Set acadApp = GetObject(, "AutoCAD.Application.16")
'if there is an error (AutoCAD not open)
If Err Then
'clear the error
Err.Clear
'open AutoCAD
Set acadApp = CreateObject("Autocad.Application.16")
'setq reference to AutoCAD Application
Set acadApp = GetObject(, "AutoCAD.Application.16")
'if there is another error
If Err Then
'inform user
MsgBox Err.Description
'exit application
Exit Sub
End If
End If
Next, set the document variable to the Document object in the AutoCAD application. The Document object is returned by the ActiveDocument property of the Application object :
Dim ThisDrawing as AcadDocument
Set ThisDrawing = acadApp.ActiveDocument
From this point on, use the "ThisDrawing" variable to reference the current AutoCAD drawing just like AutoCAD VBA.
Determining The Type of Error
After an error has occurred, your code can find out more information about the
error in several ways :
- Err - Contains a number that represents the error.
- Error - Contains a string describing the error.
- Err Object - Contains error number, description and additional information.
Also used to raise your own custom errors.
If you know how to recover from certain errors that may occur, you can use these
objects to respond intelligently to a specific error. In one of the previous examples, you
received a "File Not Found" error, which is number 53. You can easily add code
in the error handler to take appropriate action (that is, check another file) if the
value of "Err" is 53.
Hint : When you are writing an error handling routine with a message box, display the error number and description in your message box to make
troubleshooting easier.
|