Пример кода №4

Предыдущая тема Следующая тема Перейти вниз

Пример кода №4

Сообщение автор Marina-T в Чт Ноя 05, 2015 10:40 pm

Код:

...
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.
avatar
Marina-T
Admin

Сообщения : 33
Дата регистрации : 2015-11-04
Возраст : 31

Посмотреть профиль http://auslogics.online-talk.net

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор MaxMix в Вт Ноя 24, 2015 10:52 pm

Не нужно допускать ошибки в конструкторе и Try except не придется использовать. Чем проверять условие что "на ноль делить нельзя" Если просто можно не допускать таких фатальных ошибок. И условие проверки не понадобиться вот вам и оптимизация. С одной лишь оговоркой если речь идет о собственном коде Smile

MaxMix

Сообщения : 3
Дата регистрации : 2015-11-20

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор DELPHI team Auslogics в Ср Ноя 25, 2015 10:02 pm

Программиста который пишет "идеальный" код просто не существует, т.к. все допускают ошибки.
try...finally и try...except позволяют реализовать корректную обработку ошибок (которые кстати могут возникать не только по вине программиста, но и по вине системы например).
Понимание этого важно для коммерческой разработки.
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор firedragon в Ср Ноя 25, 2015 10:48 pm

Здравствуйте! На мой взгляд второе утверждение противоречит первому, а именно если в конструкторе действительно возникнет исключение, то вызов метода 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

Сообщение автор DELPHI team Auslogics в Пт Ноя 27, 2015 1:02 am

Утверждения не противоречат друг другу. Код который вы привели верный.

Нужно не просто менять except на finally, а еще и подумать о том что написано (что в данном случае и было сделано).
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор Dmitriy Hirak в Ср Дек 02, 2015 9:34 pm

Тест тест
avatar
Dmitriy Hirak

Сообщения : 1
Дата регистрации : 2015-11-26

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор SimSim в Пн Дек 07, 2015 11:44 pm

Каким образом вызов в try finally защитит тогда от ошибки в конструкторе когда переменная не nil при этом вызов free для не существующего объекта вызовет ошибку. соответсвенно внутри finally следует поместить еще try except. Вообще в ресурсоемких приложениях следует избегать применений конструкций try так как они сильно замедляют производительность кода.

SimSim

Сообщения : 1
Дата регистрации : 2015-11-27

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор DELPHI team Auslogics в Ср Дек 23, 2015 12:33 am

Защиты от ошибки в конструкторе не требуется, т.к. в случае исключения в конструкторе, автоматический вызывается деструктор
avatar
DELPHI team Auslogics

Сообщения : 11
Дата регистрации : 2015-11-21

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Пример кода №4

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения