Visual Basic’s error handling is its own special WTF in itself. For those that haven’t had to suffer through it, you can set the error-handling mode with a special On Error
statement. For example, On Error Resume Next
, is a delightful statement that tells Visual Basic to simply ignore errors, and continue execution. A good programmer will know to check errors with conditional statements.
More common, is the On Error Goto ErrHandler
approach. As the code implies, when an error occurs, this simply executes a goto to jump to a specific label, with all of the fun that goto statements normally include.
There are a few global variables that VB manages for you, so that you can find out what error occurred. Err
contains the last error code that was raised. Erl
contains the line of VB code that triggered the error, which is useful for printing out meaningful error messages.
Ryan inherited an application that used yet another VB WTF- Office Automation- to script behaviors in Microsoft Word. After he fixed one minor bug in the application by adding a single line of code, the application stopped working completely. It was difficult to debug, because there were a number of operations it performed that were likely to fail on the first few attempts, and so the error handler had retry logic built into it. Upon investigation, he found that it wasn’t ever retrying, and just insta-failing and quitting Microsoft Word.
See if you can spot why:
ErrHandler:
loopctr = loopctr + 1
If (Err=213 And (Erl = 49 Or Erl = 46 Or Erl = 44 Or Erl = 224 Or Erl = 39) ) Then
If loopctr <= 100 Then
If (Err=213 And (Erl = 49 Or Erl = 46 Or Erl = 44) ) Then
Resume Again
Else
If Erl = 39 Then
Resume again3
Else
Resume again2
End If
End If
End If
End If
Msgbox ("Error " & Err & " on line " & Erl & " - " & Error & " in CreateDocument")
If Isobject(MSWORD) Then
MSWord.Quit( wdDoNotSaveChanges )
End If
You guessed right- Ryan’s predecessor, the Erl-king, used line numbers as magic numbers to determine what the exact source of the error was. Once Ryan added a line or two of code, the numbers were all off.