A try
-finally
block may be nested inside a try
-except
block.
try
AcquireResources;
try
UseResource;
finally
ReleaseResource;
end;
except
on E: EResourceUsageError do begin
HandleResourceErrors;
end;
end;
If an exception occurs inside UseResource
, then execution will jump to ReleaseResource
. If the exception is an EResourceUsageError
, then execution will jump to the exception handler and call HandleResourceErrors
. Exceptions of any other type will skip the exception handler above and bubble up to the next try
-except
block up the call stack.
Exceptions in AcquireResource
or ReleaseResource
will cause execution to go to the exception handler, skipping the finally
block, either because the corresponding try
block has not been entered yet or because the finally
block has already been entered.