The basic structure goes something like this:
p := new(big_thing);
try
blah(p);
foo(p);
finally
dispose(p);
end;
The first line allocates a big block of memory. Then, in the "try" block,
we execute several statements, each of which might produce an error--or, in
other words, "raise an event." If an error does occur, the rest of the
"try" block will be skipped, "finally" blocks will be executed. If there
are no errors, then the "finally" block will be entered when the last
statement in the "try" block completes. So, either way, the big block of
memory gets freed. These "try/finally" blocks will trap anything up to and
including a Windows GPF.
In addition, you can construct "except" blocks which can provide local
error handling either for all errors or for particular types of error; and
you can also create your own global error handler to trap exceptions that
aren't otherwise handled by try blocks. See Chapter 7 in the Delphi User's
Guide for more details.