Пример кода №4
+2
MaxMix
Marina-T
Участников: 6
Auslogics: работа и отзывы о работе :: Примеры тестовых работ :: Тестовые работы Delphi-программистов
Страница 1 из 1
Пример кода №4
- Код:
...
try
J := TJPEGImage.Create;
J.LoadFromFile(dir + aFileName);
SRC.Assign(J);
J.Free;
except
if Assigned(J) then
J.Free;
Result := False;
end;
...
Данный код содержит несколько грубых ошибок, связанных с непониманием основных механизмов языка разработки и используемых в нем принципов освобождения ресурсов:
- При возникновении ошибки в конструкторе TJPEGImage в секции exception значение переменной J будет неопределенно, т.е. она может не равняться nil, что приведет к вызову метода Free для несуществующего объекта и как следствие к ошибке access violation.
- Логика данного участка кода предполагает использование блока try finally для контроля за уничтожением объекта TJPEGImage. Использование try finally позволит избежать ненужных проверок на существование объекта и дублирование метода Free.
Re: Пример кода №4
Не нужно допускать ошибки в конструкторе и Try except не придется использовать. Чем проверять условие что "на ноль делить нельзя" Если просто можно не допускать таких фатальных ошибок. И условие проверки не понадобиться вот вам и оптимизация. С одной лишь оговоркой если речь идет о собственном коде
MaxMix- Сообщения : 3
Дата регистрации : 2015-11-20
Re: Пример кода №4
Программиста который пишет "идеальный" код просто не существует, т.к. все допускают ошибки.
try...finally и try...except позволяют реализовать корректную обработку ошибок (которые кстати могут возникать не только по вине программиста, но и по вине системы например).
Понимание этого важно для коммерческой разработки.
try...finally и try...except позволяют реализовать корректную обработку ошибок (которые кстати могут возникать не только по вине программиста, но и по вине системы например).
Понимание этого важно для коммерческой разработки.
DELPHI team Auslogics- Сообщения : 11
Дата регистрации : 2015-11-21
Re: Пример кода №4
Здравствуйте! На мой взгляд второе утверждение противоречит первому, а именно если в конструкторе действительно возникнет исключение, то вызов метода Free в блоке finally будет произведен для несуществующего объекта J. Я к тому, что простая замена конструкции try except на try finally не решит проблему. На мой взгляд в данном случае данный кусок кода должен выглядеть примерно так:
- Код:
... try J := TJPEGImage.Create; try J.LoadFromFile(dir + aFileName); SRC.Assign(J); finally J.Free; end; except MessageBox(hwnd,'Объект не создался','ПечальБеда',MB_OK); end; ...
firedragon- Сообщения : 1
Дата регистрации : 2015-11-25
Re: Пример кода №4
Утверждения не противоречат друг другу. Код который вы привели верный.
Нужно не просто менять except на finally, а еще и подумать о том что написано (что в данном случае и было сделано).
Нужно не просто менять except на finally, а еще и подумать о том что написано (что в данном случае и было сделано).
DELPHI team Auslogics- Сообщения : 11
Дата регистрации : 2015-11-21
Re: Пример кода №4
Каким образом вызов в try finally защитит тогда от ошибки в конструкторе когда переменная не nil при этом вызов free для не существующего объекта вызовет ошибку. соответсвенно внутри finally следует поместить еще try except. Вообще в ресурсоемких приложениях следует избегать применений конструкций try так как они сильно замедляют производительность кода.
SimSim- Сообщения : 1
Дата регистрации : 2015-11-27
Re: Пример кода №4
Защиты от ошибки в конструкторе не требуется, т.к. в случае исключения в конструкторе, автоматический вызывается деструктор
DELPHI team Auslogics- Сообщения : 11
Дата регистрации : 2015-11-21
Auslogics: работа и отзывы о работе :: Примеры тестовых работ :: Тестовые работы Delphi-программистов
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|