Как реагировать на стопку, разматывающий, когда деструкторы не поддерживаются языком?
-
28-09-2019 - |
Вопрос
Предположим, вы создали экземпляр 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, который может быть долгое время.