powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / try-with-resources - шляпа?
25 сообщений из 36, страница 1 из 2
try-with-resources - шляпа?
    #40092569
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
package tel.panfilov;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.io.Closeable;
import java.io.IOException;

import static org.assertj.core.api.Assertions.assertThatThrownBy;

@Slf4j
class TryWithResourcesTest {

    @Test
    void test() {
        assertThatThrownBy(() -> {
            try (Resource resource = new Resource()) {
                resource.read();
            } catch (IOException ex) {
                log.error("io exception", ex);
            }
        }).isInstanceOf(IOException.class);
    }

    class Resource implements Closeable {

        void read() throws IOException {
            throw new IOException("read");
        }

        @Override
        public void close() throws IOException {
            throw new IOException("close");
        }
    }

}



Выхлоп:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
java.io.IOException: read
	at tel.panfilov.TryWithResourcesTest$Resource.read(TryWithResourcesTest.java:28)
	at tel.panfilov.TryWithResourcesTest.lambda$test$0(TryWithResourcesTest.java:18)
...
	Suppressed: java.io.IOException: close
		at tel.panfilov.TryWithResourcesTest$Resource.close(TryWithResourcesTest.java:33)
		at tel.panfilov.TryWithResourcesTest.lambda$test$0(TryWithResourcesTest.java:19)
		... 68 common frames omitted


java.lang.AssertionError: 
>>>Expecting code to raise a throwable.<<<

	at tel.panfilov.TryWithResourcesTest.test(TryWithResourcesTest.java:16)
...


Получается примерно так:
- у меня в проектах бОльшая часть java.io.Closeable#close выкидывает IOException, при этом эти java.io.Closeable не мои
- что делать с этим IOException на самом деле не понятно: ну вот не получилось ресурс закрыть, от того что исключение будет прокинуто вверх ничего не изменится - ресурс как бы открытым так и останется, поэтому выхода здесь два: гасить JVM или проглатывать исключение, а гасить JVM так себе затея
- при этом catch в try-with-resources перехватывает вообще все подряд, а не только close

вопрос: как на самом деле правильно делать? у меня ощущение такое что try-with-resources нужно забанить в checkstyle
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092573
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С моей кочки зрения, try с ресурсами, гарантирует вызов ресурс.close() и никак не влияет на обработку исключений.
Следовательно, делать надо ровно то, что вы делали бы при явном написании ресурс.close().
С поправкой на то, что место для обработки исключений всего одно.

TCP, кстати, тривиально обеспечивает исключение ввода-вывода "при закрытии": отправили последний пакет и не получили на него подтвержения.
При этом может быть два варианта: пакет, таки, не доставлен или, таки, не доставлен "квиток" о приёме в процессе закрытия соединения "той стороной".
Или того хлеще: вместо shutdownOutput() - сразу закрыли соединение.

P.S.
Вот так политика: "Да ну нафиг - прокинем всё наверх" - приводит к проблемам пользователей чужого кода.
Лень, конечно, двигатель прогресса, но у разумного эгоизма есть важно достоинство - он разумный.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092574
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов,

Не понял вопроса.
А почему нельзя использовать "finally"?
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092575
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одинаковый тип исключения двух функционально разных ситуаций.
В результате сложно отличить "исключение при чтении" (важно) от "исключение при закрытии" (плевать).
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092578
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
Следовательно, делать надо ровно то, что вы делали бы при явном написании ресурс.close().
С поправкой на то, что место для обработки исключений всего одно.


не понял... вот есть два сценария:
- тело выполнилось, сломался close
- тело не выполнилось, про возможно сломанный close долетает через Suppressed

вот так писать неправильно - мало ли кто там в suppressed натолкает чего:

Код: java
1.
2.
3.
4.
5.
6.
7.
try (Resource resource = new Resource()) {
    resource.read();
} catch (Exception ex) {
    if (ex.getSuppressed() != null) {
        throw ex;
    }
}



вот так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
boolean success = false;
try (Resource resource = new Resource()) {
    resource.read();
    success = true;
} catch (Exception ex) {
    if (!success) {
        throw ex;
    }
}



оно от классического:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Resource resource = null;
try {
    resource = new Resource();
    resource.read();
} finally {
    if (resource != null) {
        // здесь д.б. утильный метод
        resource.close();
    }
}



отличается только в худшую сторону
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092580
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов
отличается только в худшую сторону
Отличается оно ровно потому, что разработчик класса-для-ресурса не озаботился тщательной обработкой исключений и тупо выбросил наверх всё, что (с)могло случиться при закрытии ресурса.
У него, в отличие от вас, или вообще нет try-с-ресурсами или в него обёрнуты совсем другие объекты.

Следовательно, если в вашем конкретном случае нет возможности переработать проблемные классы, то - да, надо отказаться от try-с-ресурсами и явно обрабатывать ошибки закрытия отдельным кодом. Ну или "химичить" с флагами состояния.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092606
Андрей Панфилов- что делать с этим IOException на самом деле не понятно: ну вот не получилось ресурс закрыть, от того что исключение будет прокинуто вверх ничего не изменится - ресурс как бы открытым так и останется, поэтому выхода здесь два: гасить JVM или проглатывать исключение, а гасить JVM так себе затеяИтого, у нас две возможных ситуации:
1. Исключение во время read - при этом прежде чем заходить в catch вызовется close(). Затем в catch мы можем что-то залогировтаь или перебросить на верх.
2. Исключение во время close(). Снова либо логируем, либо выбрасываем наверх.

В обоих ситуациях вызвался close(), значит мы хотя бы попытались закрыть ресурс. Вроде логика совместима с жизнью. В обеих ситуациях мы можем исключение перебросить доверху, как будто бы ничего криминального. Да, close() сломался (и возможно кстати не дофлушил изменения), значит IO сломано -> показываем ошибку.

Учитывая что нам почти никогда настолько не везет чтоб во время close() что-то сломалось, ну увидит пользователь лишнюю (?) ошибку раз в год, ну и ладно.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092745
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно close() должен быть "тихим". Как IOUtils::closeQuietly.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092768
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иногда - тихим, иногда - нет. Это всё от внешних классов зависит.
Вопрос в другом: что делать, если в этих внешних классах сделано коряво?
С моей кочки зрения - точно не надо "предавать анафеме" try-с-ресурсами: "В пианиста просят не стрелять - играет, как умеет".
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092770
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если "Титаник" идет на дно - то никому не важно будет знать успел ли стюард протереть бокалы.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092772
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... но проблема не стоИт так остро.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092776
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Я мало знаю случаев когда надо гасить по тихому исключения.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092777
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Титаник на дно это все таки форс мажор)
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092779
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Вот пример из твоего топика. Исключения при создании линков на файлы гасить будем?
С другой стороны, в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092780
Basil A. Sidorov
Андрей Панфилов
отличается только в худшую сторону
Отличается оно ровно потому, что разработчик класса-для-ресурса не озаботился тщательной обработкой исключений и тупо выбросил наверх всё, что (с)могло случиться при закрытии ресурса.
У него, в отличие от вас, или вообще нет try-с-ресурсами или в него обёрнуты совсем другие объекты.

Следовательно, если в вашем конкретном случае нет возможности переработать проблемные классы, то - да, надо отказаться от try-с-ресурсами и явно обрабатывать ошибки закрытия отдельным кодом. Ну или "химичить" с флагами состояния.
Я правильно понимаю что тут предложение - отдельно обрабатывать исключения от close()? А в какой ситуации ты бы так делал? Я понимаю что теоретически мы могли бы складывать все в коллекцию незакрытых ресурсов и в какой-то момент пробовать снова, но делает ли кто-то так в реальных Java проектах?
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092781
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
Вот пример из твоего топика. Исключения при создании линков на файлы гасить будем?
С другой стороны, в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели.

Учитывая что утилита будет копировать десятки тысяч файлов то фейл каждого конкретного копирования (линкования)
нас не интересует. Но в финальной статистике он будет учтен. Например если всего было найдено 10 000 файлов
и из них зафейлилось 5% то я считаю что результат копирования - успешен с warnings. В лог-файле будут детали.

Это общий рекомендательный смысл. И обсуждать эту задачу в голом контексте try-resources я не могу.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092782
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton,
Я мало знаю случаев когда надо гасить по тихому исключения.

Я этого не говорил. Вообще Петро у тебя странная привычка - переиначивать сказанное. Хоть квотируй чтоли.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092784
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Я правильно понимаю что тут предложение - отдельно обрабатывать исключения от close()?
Это не предложение, а (с моей кочки зрения) логичное решение. По крайне мере той ситуации, которую я вижу.А в какой ситуации ты бы так делал?Вот Обстрактно - не знаю.
Типично ошибки close() это "какой-то мусор". С другой стороны, эти ошибки могут приводить к утечкам (системных) описателей файлов или/и сокетов.
Но это всё равно надо "от проблемы" смотреть.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092785
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp
mayton,
Я мало знаю случаев когда надо гасить по тихому исключения.

Я этого не говорил. Вообще Петро у тебя странная привычка - переиначивать сказанное. Хоть квотируй чтоли.
я знаю что ты подумал это)).
Ты тоже меня переиначивал сегодня. Бывает)
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092786
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели.
Вот только плюсатые исключения попиндикулярны умным указателям. Я уж молчу про разницу моделей "явно управляемая среда" и "среда с автоматической сборкой мусора".
Хотя ... Если так и тянет "ляпнуть умное", то годится любой повод.

В Java, если уж оставаться в рамках тематики, есть ссылки разной степени "слабости".
Другое дело, что используют их ... Почти никак не используют. Но механизм - есть.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092787
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,
Там умные ввели например чтобы кастовать память под другой тип без райзе.
Это ведь можно и просто гася исключение как раньше.
Было
try
кастуем
catch
не наследник
....
Стало
B *bp = dynamic_cast<B*>(ap);
if(bp!= NULL)
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092789
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp
mayton,
Вот пример из твоего топика. Исключения при создании линков на файлы гасить будем?
С другой стороны, в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели.

Учитывая что утилита будет копировать десятки тысяч файлов то фейл каждого конкретного копирования (линкования)
нас не интересует. Но в финальной статистике он будет учтен. Например если всего было найдено 10 000 файлов
и из них зафейлилось 5% то я считаю что результат копирования - успешен с warnings. В лог-файле будут детали.

Это общий рекомендательный смысл. И обсуждать эту задачу в голом контексте try-resources я не могу.
ну вот и получается что с примерами - все погасить тихо на close() у нас туго.
Ты свой пример не хочешь развить.
А я за то чтоб не по тихому)
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092792
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, тыж на голом JDBC кодил? Да кодил. Помню хвастался.

Так вспомни что ты делаешь при закрытии ResultSet/Statement?
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092793
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
PetroNotC Sharp, тыж на голом JDBC кодил? Да кодил. Помню хвастался.

Так вспомни что ты делаешь при закрытии ResultSet/Statement?
хороший вопрос.
Я хочу чтобы ресурс либо закрылся без исключения, либо с другим типом исключения, либо выведя любое исключение.
Как заказчик программист)
Вроде все варианты жизненные описал.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092796
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какое решение ты будешь принимать в блоке catch? Ну к примеру при закрытии Statement.
...
Рейтинг: 0 / 0
25 сообщений из 36, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / try-with-resources - шляпа?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]