Как реагировать на стопку, разматывающий, когда деструкторы не поддерживаются языком?

StackOverflow https://stackoverflow.com/questions/3879755

Вопрос

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

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

Я специально говорю о языке сценариев белки (http://www.squirrel-lang.org/). Вопреки Java, это не имеет 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 Block хранит исключение в переменной, которую вы можете проверить позже, если вы хотите потратить его, и это все еще позволяет вам возможность сделать другую очистку. Очевидно, что есть нюансы, которые вы должны знать о (например, явные виды исключения, которые нуждаются в специальной обработке, больше исключений, брошенных за пределы попробовать / поймать), но с тщательным рассмотрением вы должны быть в порядке.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top