Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор? / 25 сообщений из 71, страница 1 из 3
03.04.2019, 12:17
    #39795706
Artem.1st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
На форуме встретил эту фразу:
“Если в конструкторе произойдет исключение, то неявно вызовется деструктор”

Я не уловил, как это работает на практике. Вот пример:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
constructor TMyObject.Create;
begin
  // ... здесь Exception. Выход и вызыв деструктора

  FSubObject_1 := TObject.Create;
  FSubObject_2 := TObject.Create;
  FSubObject_3 := TObject.Create;
end;

destructor TMyObject.Destroy; 
begin
  // ... а зачем вызвать деструктор, если конструктор не отработал?

  FSubObject_1.Destroy;   // ... еще Exception ?
  FSubObject_2.Destroy;
  FSubObject_3.Destroy;
end;


Собственно вопрос в примере.
Поделитесь вашими мыслями.
...
Рейтинг: 0 / 0
03.04.2019, 12:23
    #39795710
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Artem.1st,

1. Для недоконструированного объекта будет вызван деструктор (так проще)
2. Исключения в деструкторах - харам
3. Во избежание исключений при попытке уничтожить несконструированный объект следует вызывать метод Free, вместо прямого вызова деструктора.
...
Рейтинг: 0 / 0
03.04.2019, 12:31
    #39795715
Artem.1st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Kazantsev Alexey, спасибо за ответ.
Пожалуйста, поясните про п.2 "Исключения в деструкторах - харам"
Что это значит?
...
Рейтинг: 0 / 0
03.04.2019, 12:37
    #39795722
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Artem.1stЧто это значит?
Это значит запрещены. То есть, код в деструкторе не должен приводить к необработанным исключительным ситуациям.
...
Рейтинг: 0 / 0
03.04.2019, 12:43
    #39795730
High.Programer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Kazantsev Alexey3. следует вызывать метод Free, вместо прямого вызова деструктора.
Уважаемый, вы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Ой, смотрите Destroy вызывает исключение, а мы по-хитрому вызовем Free.

Вот код из VCL , где никакие "костыли" не помогут:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
constructor TCheckListBox.Create(AOwner: TComponent);
begin
  // ... предположим здесь Исключение и вызов деструктора.
  
  FWrapperList := TList.Create;
end;

destructor TCheckListBox.Destroy;
var
  I: Integer;
begin
  //  ... если было Исключение, то FWrapperList не инициализирован

  for I := 0 to FWrapperList.Count - 1 do
    TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;
...
Рейтинг: 0 / 0
03.04.2019, 12:47
    #39795736
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
High.Programerвы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее).
Я предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации.
...
Рейтинг: 0 / 0
03.04.2019, 12:49
    #39795741
High.Programer
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Kazantsev AlexeyЯ предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации.
уважаемый, а почему авторы VCL (см. их код выше) не придерживаются этих советов?
Таки нехорошо... Ась?
...
Рейтинг: 0 / 0
03.04.2019, 12:52
    #39795743
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
ну и вызывать Destroy вообще говоря неверно
нужно Free
а лучше FreeAndNil
...
Рейтинг: 0 / 0
03.04.2019, 12:52
    #39795744
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
High.Programerа почему авторы VCL (см. их код выше) не придерживаются этих советов?
Это вопрос к авторам VCL. Кстати говоря, ни VCL, ни даже RTL, давно уже не являются примером для подражания.
...
Рейтинг: 0 / 0
03.04.2019, 12:53
    #39795745
Artem.1st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Kazantsev Alexeyкод в деструкторе не должен приводить к необработанным исключительным ситуациям.
Спасибо за ответы по существу.
А если случается исключение в деструкторе, то что тогда происходит?
...
Рейтинг: 0 / 0
03.04.2019, 12:55
    #39795750
white_nigger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Artem.1stА если случается исключение в деструкторе, то что тогда происходит?харам
...
Рейтинг: 0 / 0
03.04.2019, 12:56
    #39795751
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Artem.1stА если случается исключение в деструкторе, то что тогда происходит?
Утечки ресурсов, памяти.
...
Рейтинг: 0 / 0
03.04.2019, 12:58
    #39795754
Artem.1st
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Kazantsev Alexeyни VCL, ни даже RTL, давно уже не являются примером для подражания.
По правде говоря, я в соседней теме поднимал вопрос, про что в Delphi является "примером для подражания" :)
Если VCL и RTL не эталоны подражания, то чтож тогда...
:-(
...
Рейтинг: 0 / 0
03.04.2019, 13:08
    #39795763
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
destructor TCheckListBox.Destroy;
var
I: Integer;
begin
// ... если было Исключение, то FWrapperList не инициализирован

for I := 0 to FWrapperList.Count - 1 do
TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;

Вероятность исключения при TList.Create равна (или очень близка) нулю (не смотрел, что ещё там есть ниже). Если такое произойдёт, значит в программе есть утечка и работать она всё равно уже не будет.

Но лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
...
Рейтинг: 0 / 0
03.04.2019, 13:20
    #39795774
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Artem.1stЕсли VCL и RTL не эталоны подражания, то чтож тогда...
Стоит, пожалуй, уточнить. В общем и целом, их код можно рассматривать, как некоторую базовую основу для получения знаний. Но нужно понимать, что код пишется людьми, а людям свойственно ошибаться (приведённый выше пример из VCL - это банальная ошибка, которая не стоит потраченных на её обсуждение усилий). Откровено плохой код, такой, чтоб прям ужас-ужас, там попадается нечасто. Поэтому, рассматривать VCL/RTL, как базу знаний можно, но слепо и бездумно следовать всему, что там написано, всё же, не стоит.
...
Рейтинг: 0 / 0
03.04.2019, 13:21
    #39795776
энди
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
всегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило
...
Рейтинг: 0 / 0
03.04.2019, 13:22
    #39795778
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
DmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
Нет.
Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy
...
Рейтинг: 0 / 0
03.04.2019, 13:32
    #39795789
DmSer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Valery_BDmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
Нет.
Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy

Ты вроде не со студентами общаешься, если что...
...
Рейтинг: 0 / 0
03.04.2019, 13:48
    #39795799
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
High.ProgramerKazantsev Alexey3. следует вызывать метод Free, вместо прямого вызова деструктора.
Уважаемый, вы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее). Ой, смотрите Destroy вызывает исключение, а мы по-хитрому вызовем Free.

Вот код из VCL , где никакие "костыли" не помогут:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
constructor TCheckListBox.Create(AOwner: TComponent);
begin
  // ... предположим здесь Исключение и вызов деструктора.
  
  FWrapperList := TList.Create;
end;

destructor TCheckListBox.Destroy;
var
  I: Integer;
begin
  //  ... если было Исключение, то FWrapperList не инициализирован

  for I := 0 to FWrapperList.Count - 1 do
    TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
[src DELPHI]
destructor TCheckListBox.Destroy;
var
  I: Integer;
begin
  try
  //  ... если было Исключение, то FWrapperList не инициализирован
  except
  end;

  for I := 0 to FWrapperList.Count - 1 do
    TCheckListBoxDataWrapper(FWrapperList[I]).Free;
end;


Используйте блоки try except end; или try finally end;
...
Рейтинг: 0 / 0
03.04.2019, 13:53
    #39795805
RWolf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
эндивсегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило
Бесполезная проверка. Выбросите if — ничего не изменится.
...
Рейтинг: 0 / 0
03.04.2019, 13:57
    #39795809
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
есть офдоки.
http://docwiki.embarcadero.com/RADStudio/Rio/en/Methods_(Delphi)
там на понятном языке написано и про NIL и про Destroy и про Free
зачем еще тащить этот вопрос??
...
Рейтинг: 0 / 0
03.04.2019, 17:25
    #39795945
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Что должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь..
При проектировании класса вам надо позаботится о том, чтобы в конструкторе не смогли бы быть вызваны не ожидаемые исключения.
...
Рейтинг: 0 / 0
03.04.2019, 17:36
    #39795955
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой?
EInvalidArgumentException, например.
...
Рейтинг: 0 / 0
03.04.2019, 19:44
    #39795992
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
Kazantsev Alexey,

Это в методах должно быть. В конструкторе такое нельзя допускать и решается ассертами. Т.е. на этапе разработки такие проблемы исключаются.
...
Рейтинг: 0 / 0
03.04.2019, 19:53
    #39795997
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если в конструкторе произойдет исключение, то вызывается деструктор?
X-Cite,

А в параметризированных конструкторах?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор? / 25 сообщений из 71, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]