The error checking for built-in statements is only enabled if the program is compiled with one of the '-e', '-ex' or '-exx' options. Otherwise, no jump will be performed, but the command will still consume processor time.
With the only 'Error' statement, 'On [Local] Error Goto label' remains always working even when none of these compile options are used.
'On Error Goto 0' deactivates the current error handler. if an error occurs, FreeBASIC will not jump.
The optional 'Local' keyword (authorized only inside Sub/Function) was intended to be used to define an error handler only in the same procedure the 'On Local Error' is in (for compatibility with PDS 7.1 and VB Dos 1.0). In this case, FreeBASIC should have searched for the label in the current procedure only.
But presently, the 'Local' clause is ignored by the compiler, and the error handler can be either in the scope of the same procedure the 'On [Local] Error' is in, or in the main part of the module (if defined before the procedure).
Exception when '-gen gcc' is used (or for the fbc 64-bit): the 'Local' clause seems to be rightly taken into account, but except inside a local scope!
'On [Local] Error Goto label' is not the best way to catch errors from a built-in procedure when a syntax in the form of a function is available. The return error code can be directly tested (using the returned error code from function inhibits the QuickBASIC-like error checking and statement 'On Error Goto').
It is advisable to try to write programs compatible with the compiler '-lang fb' and option '-exx', because to test programs with option '-exx' for debugging purposes is a great helping:
- Avoid to use the statement 'Resume [Next]', because it is not at all supported by '-lang fb' (compilation error).
- On the other hand, sometimes when it is useful (when no form of a function is available), use the statement 'On [Local] Error Goto', because it runs with any option among '-e', '-ex', '-exx'. Otherwise (no error checking option), 'On [Local] Error Goto' is inactive (without compilation error), but it consumes CPU time.
The behavior of statement 'On Error Goto' (-lang fb) regarding compilation options (none, -e/-ex/-exx) is enlighten with the following program including several examples (4), to be compiled with or without error checking option (4*2=8 tests):
Code: Select all
#DEFINE Config 1
'#DEFINE Config 2
'#DEFINE Config 3
'#DEFINE Config 4
#IF Config = 1 '-----------------------------------------------------------
Open "does_not_exist" For Input As #1
Print "main end"
Sleep
System
' - with compiler option 'none' :
' console output :
' 'main end'
'
' - with compiler option '-e' or '-ex' or '-exx' :
' console output :
' 'Aborting due to runtime error 2 (file not found) at line 10 of .....'
#ENDIF '-------------------------------------------------------------------
#IF Config = 2 '-----------------------------------------------------------
Dim As Integer Result = Open("does_not_exist" For Input As #1)
If Result <> 0 Then
Print "error code returned: " & Result
Print "file not found (processed by 'Result = Open(.....)')"
End If
Print "main end"
Sleep
End
' - with compiler option 'none' or '-e' or '-ex' or '-exx' :
' console output :
' 'error code returned: 2'
' 'file not found (processed by 'Result = Open(.....)')'
' 'main end'
#ENDIF '-------------------------------------------------------------------
#IF Config = 3 '-----------------------------------------------------------
On Error Goto Error_Handler
Open "does_not_exist" For Input As #1
Print "main end"
Sleep
End
error_handler:
Print "file not found (processed by 'On Error Goto')"
On Error Goto 0
Print "QB-like error handling end"
Sleep
End
' - with compiler option 'none' :
' console output :
' 'main end'
'
' - with compiler option '-e' or '-ex' or '-exx' :
' console output :
' 'file not found (processed by 'On Error Goto')'
' 'QB-like error handling end'
#ENDIF '-------------------------------------------------------------------
#IF Config = 4 '-----------------------------------------------------------
On Error Goto error_handler
Dim As Integer Result = Open("does_not_exist" For Input As #1)
If Result <> 0 Then
Print "error code returned: " & Result
Print "file not found (processed by 'Result = Open(.....)')"
End If
Print "main end"
Sleep
End
error_handler:
Print "file not found (processed by 'On Error Goto')"
On Error Goto 0
Print "QB-like error handling end"
Sleep
End
' - with compiler option 'none' or '-e' or '-ex' or '-exx' :
' console output :
' 'error code returned: 2'
' 'file not found (processed by 'Result = Open(.....)')'
' 'main end'
#ENDIF '-------------------------------------------------------------------