Quick start manual

7-32
Delphi Language Guide
Exceptions
An exception block that contains no exception handlers, but instead consists only of a
list of statements, handles all exceptions. For example,
try
ƒ
except
HandleException;
end;
Here, the HandleException routine handles any exception that occurs as a result of
executing the statements between try and except.
Re-raising exceptions
When the reserved word raise occurs in an exception block without an object
reference following it, it raises whatever exception is handled by the block. This
allows an exception handler to respond to an error in a limited way and then re-raise
the exception. Re-raising is useful when a procedure or function has to clean up after
an exception occurs but cannot fully handle the exception.
For example, the GetFileList function allocates a TStringList object and fills it with file
names matching a specified search path:
function GetFileList(const Path: string): TStringList;
var
I: Integer;
SearchRec: TSearchRec;
begin
Result := TStringList.Create;
try
I := FindFirst(Path, 0, SearchRec);
while I = 0 do
begin
Result.Add(SearchRec.Name);
I := FindNext(SearchRec);
end;
except
Result.Free;
raise;
end;
end;
GetFileList creates a TStringList object, then uses the FindFirst and FindNext functions
(defined in SysUtils) to initialize it. If the initialization fails—for example because the
search path is invalid, or because there is not enough memory to fill in the string
listGetFileList needs to dispose of the new string list, since the caller does not yet
know of its existence. For this reason, initialization of the string list is performed in a
try...except statement. If an exception occurs, the statement’s exception block
disposes of the string list, then re-raises the exception.