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

Код: 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
23.08.2021, 06:22
    #40092573
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try-with-resources - шляпа?
С моей кочки зрения, try с ресурсами, гарантирует вызов ресурс.close() и никак не влияет на обработку исключений.
Следовательно, делать надо ровно то, что вы делали бы при явном написании ресурс.close().
С поправкой на то, что место для обработки исключений всего одно.

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

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

Не понял вопроса.
А почему нельзя использовать "finally"?
...
Рейтинг: 0 / 0
23.08.2021, 06:34
    #40092575
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try-with-resources - шляпа?
Одинаковый тип исключения двух функционально разных ситуаций.
В результате сложно отличить "исключение при чтении" (важно) от "исключение при закрытии" (плевать).
...
Рейтинг: 0 / 0
23.08.2021, 07:21
    #40092578
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try-with-resources - шляпа?
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
23.08.2021, 07:36
    #40092580
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
try-with-resources - шляпа?
Андрей Панфилов
отличается только в худшую сторону
Отличается оно ровно потому, что разработчик класса-для-ресурса не озаботился тщательной обработкой исключений и тупо выбросил наверх всё, что (с)могло случиться при закрытии ресурса.
У него, в отличие от вас, или вообще нет try-с-ресурсами или в него обёрнуты совсем другие объекты.

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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