Исключение в блоке наконец
Если исключение возникает в блоке finally, выполняется ли остаток блока finally или нет?
try
statementList1
finally
command;
command_that_raises;
critical_command;
end
Будет critical_command
быть казненным?
Руководство говорит только об исключениях, а не о выполнении кода:
Если исключение возникает, но не обрабатывается в предложении finally, это исключение распространяется из оператора try...finally, и любое исключение, уже созданное в предложении try, теряется. Следовательно, предложение finally должно обрабатывать все локально возникающие исключения, чтобы не мешать распространению других исключений.
1 ответ
Решение
Смотрите следующее подтверждение
procedure TForm6.Button1Click(Sender: TObject);
begin
try
showmessage('begin');
finally
showmessage('enter');
raise Exception.Create('raise');
showmessage('end');
end;
end;
А теперь для этого случая
procedure RaiseAndContinue;
begin
try
raise Exception.Create('raise');
except
end;
end;
procedure TForm6.Button1Click(Sender: TObject);
begin
try
showmessage('begin');
finally
showmessage('enter');
RaiseAndContinue;
showmessage('end');
end;
end;
Короткий ответ, если вы не обработаете это исключение, тогда код не будет выполнен.