Какова реальная последовательность работы блока catch и закрытия ресурса? - PullRequest
0 голосов
/ 08 сентября 2018

В Oracle Oracle документации по try-with-resources написано следующее:

Оператор try-with-resources может содержать catch и, наконец, блокировать как обычная попытка заявления. В заявлении «попробуй с ресурсами» любой блок catch или finally запускается после того, как объявленные ресурсы были закрыты.

Итак, согласно документации, если при попытке закрыть ресурс возникает исключение, и я честно пытаюсь как-то отреагировать на эту печальную новость, как здесь:

try (OutputStream os = new SampleStream(true)) {
  os.write(0); // both this and closing can throw IOWriteException 
} 
catch (IOWriteException e) {
    //do something wise;
}

при проблеме с закрытием, блок catch будет ждать закрытия вечно.

Я знаю, что на самом деле это не так, и может быть поймано исключение try-with-resources при закрытии. Но тогда упомянутое правило должно быть переформулировано. Как?

1 Ответ

0 голосов
/ 08 сентября 2018

Я знаю, что на самом деле это не так, и исключение попытки с ресурсами при закрытии можно поймать.

Право, а также на инициализацию ресурса.

Я думаю, что расширенная часть JLS"попытка с ресурсами" может помочь переформулировать это довольно неловкое объяснение.
Хотя это довольно правильно для части, касающейся утверждения finally.

Мы могли бы сказать, что:

Оператор catch в операторе try-with-resources позволяет перехватить совместимое исключение, выброшенное в любой части этого оператора, то есть 1) во время инициализации ресурса, 2) во время закрытия ресурса любого ресурс или 3) с помощью операторов, выполняемых в теле try-with-resources .
Что касается оператора finally, он будет выполнен после того, как ресурсы были закрыты (или попытались быть).

Ссылка:

14.20.3.2. Расширенная попытка с ресурсами

Оператор try-with-resources с хотя бы одним предложением catch и / или finally предложение называется расширенным оператором try-with-resources.

Значение расширенного оператора try-with-resources:

try ResourceSpecification
    Block
Catchesopt
Finallyopt

дается следующим переводом в базовую попытку с ресурсами заявление (§14.20.3.1), вложенное в try-catch или try-finally или try-catch-finally оператор:

try {
    try ResourceSpecification
        Block
}
Catchesopt
Finallyopt

Эффект от перевода поставить ResourceSpecification «внутри» оператора try. Это позволяет catch предложение расширенного оператор try-with-resources для перехвата исключения из-за автоматическая инициализация или закрытие любого ресурса.

Кроме того, все ресурсы будут закрыты (или попытались закрыт) к моменту выполнения блока finally в соответствии с намерение ключевого слова finally.

...