| Сегодня мы познакомимся с исключительными ситуациями. Для чего они нужны? Допустим, что у тебя есть участок кода, где может произойти ошибка. Как сделать так, чтобы программа не вылетала при её возникновении? Очень просто. Надо заключить этот код в блок проверки исключений и тогда твоя прога выдержит даже цунами :). И так. Простейший блок исключений выгляди как: TRY //Здесь ты пишешь код, в котором может произойти ошибка EXCEPT //Если ошибка произошла, то выполнится этот код END; Рассмотрим простейший пример: TRY x:=y/0; EXCEPT Application.MessageBox('На ноль делить нельзя.','Ошибка!', MB_OK + MB_ICONINFORMATION); END; x:=0; Между 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 всегда будет удалён корректно и мы освободим память. Опять сложный материал превратился в очень простой.
|