powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Если в конструкторе произойдет исключение, то вызывается деструктор?
25 сообщений из 71, страница 1 из 3
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #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
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795710
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1st,

1. Для недоконструированного объекта будет вызван деструктор (так проще)
2. Исключения в деструкторах - харам
3. Во избежание исключений при попытке уничтожить несконструированный объект следует вызывать метод Free, вместо прямого вызова деструктора.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795715
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, спасибо за ответ.
Пожалуйста, поясните про п.2 "Исключения в деструкторах - харам"
Что это значит?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795722
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stЧто это значит?
Это значит запрещены. То есть, код в деструкторе не должен приводить к необработанным исключительным ситуациям.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #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
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795736
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.Programerвы предлагаете использовать "костыли"(зная о проблеме подстроиться под нее).
Я предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795741
High.Programer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev AlexeyЯ предлагаю следовать советам документации. И таки да, писать код зная об особенностях реализации.
уважаемый, а почему авторы VCL (см. их код выше) не придерживаются этих советов?
Таки нехорошо... Ась?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795743
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и вызывать Destroy вообще говоря неверно
нужно Free
а лучше FreeAndNil
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795744
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
High.Programerа почему авторы VCL (см. их код выше) не придерживаются этих советов?
Это вопрос к авторам VCL. Кстати говоря, ни VCL, ни даже RTL, давно уже не являются примером для подражания.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795745
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyкод в деструкторе не должен приводить к необработанным исключительным ситуациям.
Спасибо за ответы по существу.
А если случается исключение в деструкторе, то что тогда происходит?
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795750
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stА если случается исключение в деструкторе, то что тогда происходит?харам
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795751
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stА если случается исключение в деструкторе, то что тогда происходит?
Утечки ресурсов, памяти.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795754
Artem.1st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyни VCL, ни даже RTL, давно уже не являются примером для подражания.
По правде говоря, я в соседней теме поднимал вопрос, про что в Delphi является "примером для подражания" :)
Если VCL и RTL не эталоны подражания, то чтож тогда...
:-(
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #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
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795774
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artem.1stЕсли VCL и RTL не эталоны подражания, то чтож тогда...
Стоит, пожалуй, уточнить. В общем и целом, их код можно рассматривать, как некоторую базовую основу для получения знаний. Но нужно понимать, что код пишется людьми, а людям свойственно ошибаться (приведённый выше пример из VCL - это банальная ошибка, которая не стоит потраченных на её обсуждение усилий). Откровено плохой код, такой, чтоб прям ужас-ужас, там попадается нечасто. Поэтому, рассматривать VCL/RTL, как базу знаний можно, но слепо и бездумно следовать всему, что там написано, всё же, не стоит.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795776
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795778
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
Нет.
Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795789
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_BDmSerНо лучше в деструкторе сначала выполнить проверку if Assigned(FWrapperList) then...
Нет.
Гораздо лучше тебе посмотреть в чём отличие .Free от .Destroy

Ты вроде не со студентами общаешься, если что...
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #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
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795805
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эндивсегда на автопилоте делаю if Assigned(xxx) then FreeAndNil(xxx). пока не подводило
Бесполезная проверка. Выбросите if — ничего не изменится.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795809
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть офдоки.
http://docwiki.embarcadero.com/RADStudio/Rio/en/Methods_(Delphi)
там на понятном языке написано и про NIL и про Destroy и про Free
зачем еще тащить этот вопрос??
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795945
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой? Максимум что приходит в голову, только EOutOfMemory и EExternal какие-нибудь..
При проектировании класса вам надо позаботится о том, чтобы в конструкторе не смогли бы быть вызваны не ожидаемые исключения.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795955
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteЧто должно происходить в конструкторе класса чтобы он упал по ошибке, причем допустимой?
EInvalidArgumentException, например.
...
Рейтинг: 0 / 0
Если в конструкторе произойдет исключение, то вызывается деструктор?
    #39795992
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

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

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


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