По моему мнению, есть только одна причина, по которой строительство объекта не должно сопровождаться ( или "in", как указал Мейсон ) a try / finally
блок.
- Если временем жизни объекта управляет другой объект.
Это управление может принимать три формы:
- Ссылка на объект имеет область действия за пределами локального блока и освобождается в другом месте - как член поля, освобожденный в деструкторе.
- Объект немедленно добавлен в список, который отвечает за освобождение объекта позже.
- Объект со связанным менеджером времени жизни, например способ передачи владельца элементу управления VCL при создании.
С # 1 , , когда ссылка имеет более широкую область действия , ссылка должна быть немедленно установлена равной нулю, если она не создана сразу. Таким образом, когда он проверяется для справки, вы знаете, что у вас есть точные данные. Это наиболее часто встречается в объектах-членах, которые создаются как часть более крупного класса, а затем очищаются при уничтожении родительского объекта.
С # 2 , , когда объект добавляется в список , вы хотите использовать блок try-except
(один из немногих, когда я его использую) на всякий случай исключение происходит после создания объекта и до его добавления в список управления. В идеале первая строка после конструкции добавляет его в список, или список на самом деле является фабричным классом, который дает вам объект, уже добавленный в список.
С # 3 , , когда у объекта есть другой менеджер времени жизни , вы действительно должны убедиться, что управление этим менеджером является правильным решением. Если вы создаете элемент управления VCL, у вас может возникнуть искушение владеть формой (или любым другим элементом управления), но это фактически накладывает дополнительные затраты на конструкцию и разрушение. Если возможно, вы должны явно освободить его, это особенно верно, если вы включаете элемент управления один раз, тогда вы знаете, что освободите его в деструкторе вашей формы или когда он закроется. Единственный раз, когда вы не можете сделать это, это если создание элемента управления является более динамичным.
Так что да, лучше всего использовать множество try / finally
блоков. У вас должно быть только несколько try / except
блоков, и большинство из них должны перехватывать очень специфические типы исключений и / или повторно вызывать исключение. Если у вас больше try / except
блоков try / finally
, то вы делаете неправильно .