Как реагировать на раскручивание стека, когда деструкторы не поддерживаются языком? - PullRequest
3 голосов
/ 07 октября 2010

Предположим, вы создали экземпляр класса Window. Окно показывается пользователю. Затем выдается исключение, и ссылка на экземпляр теряется, но окно все еще видит пользователь, потому что экземпляр все еще существует (на него больше нет ссылок).

Что делать в этих условиях?

Я специально говорю о скриптовом языке Squirrel (http://www.squirrel -lang.org /). В отличие от Java, здесь нет блоков finally или методов финализатора, так что обработка исключений нарушена на этом языке?

1 Ответ

0 голосов
/ 07 октября 2010

Я не знаю белка, но даже в отсутствие блока finally вы могли бы до некоторой степени смоделировать поведение в Java:

Exception error = null;
try {
 // do something
}
catch (Exception e) {
  error = e;
}
// My finally code goes here
// ...
if (error != null) {
  // Oh dear clean up all my resources - files, windows, sockets etc.
  throw error;
}

Таким образом, блок catch хранит исключение в переменной, которую вы можете проверить позже, если хотите сбросить ее, и это все еще дает вам возможность выполнить другую очистку. Очевидно, что есть нюансы, о которых вы должны знать (например, явные виды исключений, которые требуют особой обработки, большее количество исключений выдается за пределами try / catch), но при тщательном рассмотрении вы должны быть в порядке.

Системные ресурсы (такие как графические дескрипторы, сокеты, окна, файловые дескрипторы и т. Д.), В частности, в Java и других языках с мусором, как правило, немного запутаны. Обычно этими ресурсами управляет класс с явным методом close (). Поэтому, если вы знаете, что вещи попали в кучу, вы обычно вызываете явный close () для объектов, чтобы сразу их очистить. В противном случае объект будет очищаться во время завершения, но только во время GC, который может продолжаться долго.

...