У меня есть вопрос, касающийся обработки исключений и управления ресурсами, и мне было интересно, если кто-нибудь может поделиться своим мнением. Мне нужно выполнить последовательность действий: прочитать настройки приложения, настроить среду, сделать материал и затем в конце концов очистить. Очистка включает разрушение среды, но это должно произойти только в том случае, если она была успешно настроена в первую очередь.
Вот мой первый (и неудачный) подход:
try {
readSettings();
setupEnvironment();
} catch (Exception ex) {
logStackTrace(ex);
displayError(ex);
closeCommThreads();
return;
}
try {
// do stuff
} catch (Exception ex) {
logStackTrace(ex);
displayError(ex);
} finally {
teardownEnvironment();
closeCommThreads();
}
Это казалось немного уродливым, поэтому я решил поискать лучшее решение. Я немного читал, и многие статьи голосовали за большие блоки try/catch
и использовали (каламбур?) finally
для очистки. Итак, вот моя вторая попытка:
try {
readSettings();
setupEnvironment();
// do stuff
} catch (Exception ex) {
logStackTrace(ex);
displayError(ex);
} finally {
teardownEnvironment();
closeCommThreads();
}
Чтобы сделать эту работу, мне пришлось удалить последовательную связь из teardownEnvironment()
, чтобы ее можно было вызывать в любое время - до или после setupEnvironment()
(для редакторов: какой-нибудь способ выразить это лучше?). Это правильный подход? Я чувствую себя немного странно, чтобы порвать перед установкой.
Edit:
Просто чтобы сделать это немного более явным: я удалил последовательную связь, добавив дополнительную проверку внутри teardownEnvironment
- что-то вроде if (!isSetup()) return;
.