powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / try-with-resources - шляпа?
36 сообщений из 36, показаны все 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
try-with-resources - шляпа?
    #40092798
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Вот пример тебе.
Ты мог создать хранимку. Потом пошел close() но соединение ИЗ ЗА ПЛОХОЙ СЕТИ уже закрылось.
Ресурсы освободятся.
Но райзе будет.
Важно разобраться? Для меня да. В логах будем выяснять что не так и почему.
https://stackoverflow.com/questions/51636439/in-what-cases-can-a-statement-close-throw-exception-what-does-it-mean-for-the-c
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092799
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А какое решение ты будешь принимать в блоке catch? Ну к примеру при закрытии Statement.
первое по любому в логи уровнем warning.
Потом после опытной эксплуатации можно сменить приоритет.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092800
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поэтому я и не мог понять твой термин "гасить".
))) Нужна конкретика.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092801
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пфф.... гасить? Ох Петро. Поменяй пароль. Боты же просто бесятся в твоём акке.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092804
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Здравствуй стас.
Он тоже так - ничего по IT. А все охи и ахи как у баб
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092840
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Я понимаю что теоретически мы могли бы складывать все в коллекцию незакрытых ресурсов и в какой-то момент пробовать снова, но делает ли кто-то так в реальных Java проектах?


Смысла в этом не особо много: если мы сразу не смогли закрыть, то откуда появляется гипотеза, что сможем закрыть потом? Там на мой взгляд шансов еще меньше:
- кто-то может выкидывать исключение на повторный close() (я сам где-то год назад багу в openjdk заводил вроде на ZipFileSystem)
- кто-то может ресурс гвоздями прибить к потоку - еще и зависать будет
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092846
Андрей Панфилов
Stanislav Bashkyrtsev
Я понимаю что теоретически мы могли бы складывать все в коллекцию незакрытых ресурсов и в какой-то момент пробовать снова, но делает ли кто-то так в реальных Java проектах?


Смысла в этом не особо много: если мы сразу не смогли закрыть, то откуда появляется гипотеза, что сможем закрыть потом?
Когда я ищу инфу на тему "когда close() выбрасывает исключения", то один из частых ответов - сетевой диск стал недоступным. Я не знаю что случается с такими file descriptor'ами, но если они продолжают висеть, то периодически повторять close() не лишено смысла.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092849
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev,
Долби не долби, твои дескрипторы невалидны.
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092862
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
mayton
А какое решение ты будешь принимать в блоке catch? Ну к примеру при закрытии Statement.
первое по любому в логи уровнем warning.
Потом после опытной эксплуатации можно сменить приоритет.

А сколько времени продлится эксплуатация? И до какого уровня понижать?
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092870
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Вот про IT можно поговорить.
Время эксплуатации очень индивидуальная штука.
Например, на стендах разработчиков сеть устойчивая и машинки с обновляемой виндой.
При установке ИС заказчику там винда 8.1 не обновлялась никогда. И сеть глюкавая.
Значит в логах куча варнингов по сабжу.
Но мы то причину не знаем, пока их админ и наши эксперты не проанализируют что не так.
Потом можно и костыль, и загасить и... уровень в info... Для данного конкретного случая.
Можно не уровень а в конфиге логгера убрать баг в отдельный файл и папку.
Имхо
...
Рейтинг: 0 / 0
try-with-resources - шляпа?
    #40092875
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
Андрей Панфилов
пропущено...


Смысла в этом не особо много: если мы сразу не смогли закрыть, то откуда появляется гипотеза, что сможем закрыть потом?
Когда я ищу инфу на тему "когда close() выбрасывает исключения", то один из частых ответов - сетевой диск стал недоступным. Я не знаю что случается с такими file descriptor'ами, но если они продолжают висеть, то периодически повторять close() не лишено смысла.

Если nfs сервер детектировал закрытый сокет и закрыл его с "той стороны" то говорить close() нам будет
уже некому. Close в нашем java коде превращается в пустую формальность. Попробовали тихое закрытие.
Не получилось - и хрен с ним. Грязные бокалы тонут вместе с круизным лайнером.

Для статистики можно завести какой-нибудь AtomicInt счетчик и складывать туда все неудачные сетевые
интеракции по закрытию. И если проблем будет очень много тогда эта статистика будет в помошь. Но мне кажется
что ничего умного в этом close нельзя написать.
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / try-with-resources - шляпа?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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