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

В соответствии с этим связь, если источник имеет проблему при открытии и выдает исключение, а также находится в круглых скобках try, JVM закрывает его. У меня вопрос, как сообщить пользователю сейчас, что этот источник закрыт, и мы столкнулись с проблемой при открытии этого ресурса? Другими словами, как можно обработать это исключение?

Как и любое другое исключение: написав код в блоке catch. docs.oracle.com/javase/tutorial/essential/exceptions/…

luk2302 21.03.2022 12:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
38
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Даже при использовании try-with-resources предложение catch все еще работает.

private static void printFile() throws MyCustomException {

    try(FileInputStream input = new FileInputStream("file.txt")) {

        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    } catch (IOException e) {
        throw new MyCustomException("There was an error while opening the resource", e);
    }
}
Ответ принят как подходящий

Кажется тривиальным. Обычно код Java выполняется в какой-то среде «без взаимодействия с пользователем» (серверы и т.п.). Правильный шаг — позволить исключению всплывать — вы хотеть выполняете ежедневную работу, которая находится на полпути к чтению базы данных, чтобы открыть связанный файл, а затем отправить журналы в долгосрочное хранилище или что-то еще в полностью прервать и написать примечание в журнальный файл. Обычно для таких заданий есть некоторая атомарная функциональность (в этом случае, возможно, каждый такой файл независим от других, и можно пока оставить «сломанный» файл на месте, пока администратор сервера не сможет просмотреть его, продолжая обработайте оставшуюся часть - в этом случае «выполнить ротацию резервных копий в ЭТОМ файле» является атомарной функциональностью): поймать все исключения и написать код, который делает то, что вы хотите, когда задание терпит неудачу. Например, мои серверы могут отправлять уведомления прямо на телефоны администраторов (через телеграмму или pushover, или с помощью slack API, и есть много сервисов, которые автоматизируют это и для вас), если это важно, вы бы написали это в своем блоке catch.

Для кода, который непосредственно «запускается» пользователем, скажем, функцией «сохранить файл», это не столько «ресурс сейчас закрыт» — ресурсы недолговечны (они не могут быть — нет, если вы используете try- с ресурсами). Они либо никогда не открывались в первую очередь (вы пытаетесь сохранить файл в несуществующем каталоге - попытка создать новый OutputStream уже не удалась, он никогда не был открыт с самого начала), или, возможно, это открыл, но это было на USB-накопителе, и пользователь вытащил его на полпути сохранения. Ресурс просто закрыт, независимо от того, в java вы его .close() или нет - вся флешка пропала!!

Единственное, что сделал для вас аспект «безопасного закрытия» попытки с ресурсами, - это убедиться, что ваш Java-процесс не тратит впустую дескриптор файла.

Вы справляетесь с этим так же, как справляетесь практически с любой «неисправимой» (вы не можете написать программное обеспечение, которое гипнотизирует пользователя, заставляя его вставить эту флешку обратно в машину, очевидно, - как следствие, это не восстанавливается, как и большинство исключений) проблема : Вы вызываете диалоговое окно, объясняющее ситуацию.

try (OutputStream out = Files.newOutputStream(saveGameFile)) {
  boardState.save(out);
} catch (IOException e) {
  // show dialog here
}

Два блока try не нужны. Оператор try-with-resources может иметь блок catch.

VGR 21.03.2022 15:05

Странный мой мозгооо, @VGR - спасибо, что заметили! Я отредактировал ответ соответственно.

rzwitserloot 21.03.2022 20:20

Другие вопросы по теме