Error Handling in LotusScript Agents
Chuck Connell, CHC-3 Consulting
What We’ll Cover …
•
Looking at the general principles of good software error handling
•
Identifying compile-time error detection in LotusScript
(LS)
•
Understanding runtime error detection and reporting in LS
•
Setting up error handlers in LS
•
Dealing with special-case errors in LS
•
Using an error log file in LS for periodic agents
Why This Matters
•
Topics covered apply to all scripting situations
Pull-down actions, email buttons, form/view buttons
Form/view/database event triggers
Periodic/nightly agents
•
Admins need accurate and clear error reporting from
server agents
Often have a lot to review each morning
Hard to diagnose cryptic errors in the server log
Must know when something goes wrong, and just what the
problem is
Worst thing is not knowing there is a problem
Principles of Good Error Handling
•
Catch errors as early as possible
Design-time is better than code-time
Compile-time is better than test-time
Testing is better than production
Catching errors earlier is cheaper and faster
•
Report meaningful error messages
Tell the user what is really wrong
Suggest how to fix the problem
•
Make full use of language’s error mechanisms
LotusScript gives you many such tools
We will show most during this talk
Compile Time, Option Declare
•
Option Declare is the single most important line in any
LotusScript code
Forces all variables to be declared
Put it in the Options code section (object)
Catches many errors immediately
It is OFF by default, should be ON
However, developers can change the default in the
Programmer’s Pane properties box
Compile Time, Explicit Data Types
•
Variables default to Variant type
Convenient, since Variants can be almost anything
Also dangerous, since Variants can be almost anything
Solution is to put an explicit type on all Dim
statements
•
Notes:
Only small number of situations where Variant is really
needed
Can use suffix chars for typing (@, #, %, !), but hard
to read and remember
Compile Time, Constants
•
Use of constants for embedded text and numbers is SOP
for all programming languages
•
Somehow, LotusScript programmers often overlook this
basic principle
•
Why is it related to error handling?
If you don’t do it, you will have hard-to-find
errors
•
Suppose there are 10,000 lines of code; you want to
change the view name
Compile Time, Soft Field Names
•
This topic is similar to using constants, except the
constants are Notes field names
Even programmers who use regular constants often
overlook this application
•
Benefit is the same as string/number constants
When you want to change a field name (very common), it
is much easier this way
•
Suppose there are 100 references to many different
field names, and you want to change them
•
Code sample, named “Soft Fields”
Runtime, Check Notes Objects
•
Whenever you work with a Notes object, make sure it
really exists
•
This coding mistake leads to errors that are tough to
find
The line with the runtime error is often far from the
line with the coding error
•
We cause runtime error by changing Tim’s name
•
What line trips the runtime error reporting?
•
Any missing object is reported immediately
LS Error Handlers, Theory
•
When LS encounters a runtime error, it looks for a
local user-defined error handler for that error code
•
If no local handler is found, LS looks for one in the
calling procedure, then the next up calling procedure, etc.
•
If none are found, LS calls a simple built-in handler,
then exits
•
So how do you create an error handler…?
Tell LS what error handler to use for each error code
Create the error handler routines
Error Handlers – Sample
•
Tells LS what to do with an error
On Error Goto ErrorReturn
Which errors?
üAll of them
What to do?
üGo to
ErrorReturn label
•
Set up error handler
Block
of code from ErrorReturn
to Exit Sub
Notice the Err, Error$, and Erl variables – defined
within error handlers
Notice the Resume statement – means that error handling
is done
•
You don’t need an error handler in every routine
Can allow LS to “fail up” to a higher-level routine
This is often good software design
Special Error Handlers
•
Sometimes, an LS runtime error is not really an error
You don’t want to exit or fail
•
Code sample, named Special Errors
On Error DIR_ERROR Resume Next
Means: “For just error code 76, keep processing”
Test by renaming the temp file
•
Other points
To get the relevant error code, you usually have to
print it out
Second general On Error erases the special instructions
Notes Error Log
•
So, all this looks nice interactively…
•
But what about nightly agents?
Print statements from periodic agents are written to
server log file
These are tough to find in the morning
•
How about a special log file for periodic agents?
•
Code sample, named Error Log
We will look at each line
Log file uses ALOG4NTF template
Code uses NotesLog class
LogAction vs LogError
Handles timestamps, error codes, and messages
•
Can anyone see a problem with this code?
Notes Error Log, Caution
•
Suppose your code has a runtime error before the
error log is set up
•
For industrial-strength code
Create a temporary “print” handler at the start
Then switch to the log handler after it is created
7 Key Points to Take Home
•
Scan code for good LS error handling
•
Are database, view, and field names soft-coded at the
top?
•
Is there an On Error statement near the top?
•
Do early database and view opens have an immediate
validity check?
•
Do you see Option Declare?
•
If this is a periodic server agent, do you see the
NotesLog class?
•
Insist on error handling for all server-based Agents