RE: Как правильно писать операторы Try..Finally..Except? < / а>
Меня все еще смущает исходный вопрос OP. В частности, последняя строка процедуры (за пределами try..finally..end), которая читает «Screen.Cursor: = crDefault».
Насколько я понимаю, любые исключения, возникающие внутри блока try..except | finally..end, БУДУТ выполнять код после «конца» «попытки».
procedure TForm1.Button1Click(Sender: TObject);
var
Obj: TSomeObject;
begin
Screen.Cursor := crHourGlass;
Obj := TSomeObject.Create;
try
// do something
finally
Obj.Free;
end;
Screen.Cursor := crDefault;
end;
В приведенном выше примере я не вижу причин, по которым "Screen.Cursor: = crDefault" не будет выполняться. Пожалуйста, поправьте меня, если я ошибаюсь.
В качестве еще одного примера я скомпилировал этот небольшой фрагмент кода, чтобы проиллюстрировать это. При запуске кода будут представлены ТРИ (3) диалога ShowMessage (). Первое «исключение поднято», второе «наконец» и третье «в конце».
procedure TForm1.Button1Click(Sender: TObject);
begin
try
try
showMessage(format('%s', [12]));
except
showMessage('Exception raised');
end;
finally
showMessage('finally');
end;
showMessage('at end');
end;
Итак, я не понимаю, почему его "Screen.Cursor: = crDefault" не запускается в исходной форме и коде. Кто-нибудь может уточнить?