💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На весь тест отведено 70 минут. Код лучше сначала разобрать вручную: правильный вариант должен объяснять механизм, а не только совпадать с одним запуском.
Вопрос 14 из 25
Какой граничный результат следует ожидать в `NestedResources`, когда после `Input := TFileStream.Create('a.bin', fmOpenRead);` выполняется `Input.Free;`?
Pascal Delphi / Pascal · Освобождение ресурсов Копировать
// Определите реальную гарантию в NestedResources.
program NestedResources;
{$APPTYPE CONSOLE}
uses System.Classes;
var
Input, Output: TFileStream;
begin
Input := TFileStream.Create('a.bin', fmOpenRead);
try
Output := TFileStream.Create('b.bin', fmCreate);
try
Output.CopyFrom(Input, 0);
finally
Output.Free;
end;
finally
Input.Free;
end;
end.
Добавление контекста требует заменить исходное исключение, поэтому его тип приходится потерять.
`raise E` полностью равнозначно пустому `raise` внутри обработчика.
Каждый ресурс помещают под защиту только после успешного получения.
Все ресурсы сначала создают, а затем помещают под один общий `try..finally`, считая сбой второго конструктора безопасным для первого.
Стек можно сохранить, создав новое исключение с тем же текстом.
Вопрос 18 из 25
Какие данные обработчик `EInsufficientFunds` получает без разбора строки `Message`?
Pascal Delphi / Pascal · Собственные исключения Копировать
// Предметное исключение публикует структурированные данные только для чтения.
program DomainException;
{$APPTYPE CONSOLE}
uses System.SysUtils;
type
EInsufficientFunds = class(Exception)
private
FBalance, FRequested: Currency;
public
constructor Create(ABalance, ARequested: Currency);
property Balance: Currency read FBalance;
property Requested: Currency read FRequested;
end;
constructor EInsufficientFunds.Create(ABalance, ARequested: Currency);
begin
FBalance := ABalance;
FRequested := ARequested;
inherited CreateFmt('Balance %.2f, requested %.2f', [ABalance, ARequested]);
end;
begin
try
raise EInsufficientFunds.Create(25, 40);
except
on E: EInsufficientFunds do
Writeln(E.Balance:0:2, ' ', E.Requested:0:2);
end;
end.
Текст стандартного `Exception` является стабильным машинным протоколом и подходит для ветвления бизнес-логики.
Текст сообщения исключения — устойчивый машинный код для ветвления.
Поля доступны обработчику напрямую, даже если они `private` и не имеют открытых свойств.
Один общий класс `Exception` с разными текстами точнее предметной иерархии.
Обработчик различает класс исключения и читает `Balance` и `Requested` через открытые свойства.