Язык программирования Delphi. Исключительные ситуации:
Сегодня мы познакомимся с исключительными ситуациями. Для чего они нужны? Допустим, что у тебя есть участок кода, где может произойти ошибка. Как сделать так, чтобы программа не вылетала при её возникновении? Очень просто. Надо заключить этот код в блок проверки исключений и тогда твоя прога выдержит даже цунами :).
И так. Простейший блок исключений выгляди как:
TRY
//Здесь ты пишешь код, в котором может произойти ошибка
EXCEPT
//Если ошибка произошла, то выполнится этот код
END;
Между TRY и EXCEPT я вставил маленькое действие - деление на ноль. Компьютер не умеет делать такие вещи, поэтому произойдёт ошибка и выполнится код между EXCEPT и END. После обработки ошибки процедура заканчивает выполнение и все остальные операторы не будут выполнены, как, например, в нашем случае - x:=0;
Если бы мы поменяли 0 на любое другое число, то ошибки бы не было и код между EXCEPT и END никогда не выполнился бы.
Давай посмотрим ещё пример:
var
b:TBitmap
begin
b:= TBitmap.Create;
TRY
b.Canvas.Rectangle(1,1,100,100);
EXCEPT
Application.MessageBox('Ошибка рисования.','Ошибка!',
MB_OK + MB_ICONINFORMATION);
b.free;
END;
b.free;
end;
В этом примере мы создаём объект b типа TBitmap. Потом начинаем блок TRY. В этом блоке мы пытаемся начать рисование. Если во время рисования произошла ошибка, то вызывается окно с сообщенеием Application.MessageBox и освобождается память b.free. После этого происходит выход из процедуры. Если ошибок не было, то просто освобождается память b.free.
Теперь давай разберёмся с ещё одним типом исключительных ситуаций - TRY ... FINALLY:
TRY
//Здесь ты пишешь код, в котором может произойти ошибка
FINALLY
//Этот код выполнится в любом случае
END;
Между TRY и FINALLY ты пишешь свой сомнительный код, в котором может произойти ошибка. А между FINALLY и END ты пишешь код, который должен выполнится в не зависимости от результата кода. В этом случае мы не можем информировать пользователя об ошибки, потому что в разделе FINALLY мы не знаем произошла ошибка или нет. Зато вот такой пример будет уместен:
var
b:TBitmap
begin
b:= TBitmap.Create;
TRY
b.Canvas.Rectangle(1,1,100,100);
FINALLY
b.free;
END;
end;
Подобный пример мы уже рассматривали. В этом случае мы создаем объект b и пытаемся нарисовать. В разделе FINALLY мы удаляем созданный объект b. Теперь мы уверены, что b всегда будет удалён корректно и мы освободим память.
Опять сложный материал превратился в очень простой.