|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Код: Код: 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.
Выхлоп: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Получается примерно так: - у меня в проектах бОльшая часть java.io.Closeable#close выкидывает IOException, при этом эти java.io.Closeable не мои - что делать с этим IOException на самом деле не понятно: ну вот не получилось ресурс закрыть, от того что исключение будет прокинуто вверх ничего не изменится - ресурс как бы открытым так и останется, поэтому выхода здесь два: гасить JVM или проглатывать исключение, а гасить JVM так себе затея - при этом catch в try-with-resources перехватывает вообще все подряд, а не только close вопрос: как на самом деле правильно делать? у меня ощущение такое что try-with-resources нужно забанить в checkstyle ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 05:45 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
С моей кочки зрения, try с ресурсами, гарантирует вызов ресурс.close() и никак не влияет на обработку исключений. Следовательно, делать надо ровно то, что вы делали бы при явном написании ресурс.close(). С поправкой на то, что место для обработки исключений всего одно. TCP, кстати, тривиально обеспечивает исключение ввода-вывода "при закрытии": отправили последний пакет и не получили на него подтвержения. При этом может быть два варианта: пакет, таки, не доставлен или, таки, не доставлен "квиток" о приёме в процессе закрытия соединения "той стороной". Или того хлеще: вместо shutdownOutput() - сразу закрыли соединение. P.S. Вот так политика: "Да ну нафиг - прокинем всё наверх" - приводит к проблемам пользователей чужого кода. Лень, конечно, двигатель прогресса, но у разумного эгоизма есть важно достоинство - он разумный. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 06:22 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Андрей Панфилов, Не понял вопроса. А почему нельзя использовать "finally"? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 06:28 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Одинаковый тип исключения двух функционально разных ситуаций. В результате сложно отличить "исключение при чтении" (важно) от "исключение при закрытии" (плевать). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 06:34 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Следовательно, делать надо ровно то, что вы делали бы при явном написании ресурс.close(). С поправкой на то, что место для обработки исключений всего одно. не понял... вот есть два сценария: - тело выполнилось, сломался close - тело не выполнилось, про возможно сломанный close долетает через Suppressed вот так писать неправильно - мало ли кто там в suppressed натолкает чего: Код: java 1. 2. 3. 4. 5. 6. 7.
вот так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9.
оно от классического: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
отличается только в худшую сторону ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 07:21 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Андрей Панфилов отличается только в худшую сторону У него, в отличие от вас, или вообще нет try-с-ресурсами или в него обёрнуты совсем другие объекты. Следовательно, если в вашем конкретном случае нет возможности переработать проблемные классы, то - да, надо отказаться от try-с-ресурсами и явно обрабатывать ошибки закрытия отдельным кодом. Ну или "химичить" с флагами состояния. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 07:36 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Андрей Панфилов- что делать с этим IOException на самом деле не понятно: ну вот не получилось ресурс закрыть, от того что исключение будет прокинуто вверх ничего не изменится - ресурс как бы открытым так и останется, поэтому выхода здесь два: гасить JVM или проглатывать исключение, а гасить JVM так себе затеяИтого, у нас две возможных ситуации: 1. Исключение во время read - при этом прежде чем заходить в catch вызовется close(). Затем в catch мы можем что-то залогировтаь или перебросить на верх. 2. Исключение во время close(). Снова либо логируем, либо выбрасываем наверх. В обоих ситуациях вызвался close(), значит мы хотя бы попытались закрыть ресурс. Вроде логика совместима с жизнью. В обеих ситуациях мы можем исключение перебросить доверху, как будто бы ничего криминального. Да, close() сломался (и возможно кстати не дофлушил изменения), значит IO сломано -> показываем ошибку. Учитывая что нам почти никогда настолько не везет чтоб во время close() что-то сломалось, ну увидит пользователь лишнюю (?) ошибку раз в год, ну и ладно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 10:23 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Возможно close() должен быть "тихим". Как IOUtils::closeQuietly. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 17:36 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Иногда - тихим, иногда - нет. Это всё от внешних классов зависит. Вопрос в другом: что делать, если в этих внешних классах сделано коряво? С моей кочки зрения - точно не надо "предавать анафеме" try-с-ресурсами: "В пианиста просят не стрелять - играет, как умеет". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 18:19 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Если "Титаник" идет на дно - то никому не важно будет знать успел ли стюард протереть бокалы. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 18:28 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
... но проблема не стоИт так остро. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 18:29 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
mayton, Я мало знаю случаев когда надо гасить по тихому исключения. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 18:43 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
mayton, Титаник на дно это все таки форс мажор) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 18:44 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
mayton, Вот пример из твоего топика. Исключения при создании линков на файлы гасить будем? С другой стороны, в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 18:58 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov Андрей Панфилов отличается только в худшую сторону У него, в отличие от вас, или вообще нет try-с-ресурсами или в него обёрнуты совсем другие объекты. Следовательно, если в вашем конкретном случае нет возможности переработать проблемные классы, то - да, надо отказаться от try-с-ресурсами и явно обрабатывать ошибки закрытия отдельным кодом. Ну или "химичить" с флагами состояния. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:02 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp mayton, Вот пример из твоего топика. Исключения при создании линков на файлы гасить будем? С другой стороны, в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели. Учитывая что утилита будет копировать десятки тысяч файлов то фейл каждого конкретного копирования (линкования) нас не интересует. Но в финальной статистике он будет учтен. Например если всего было найдено 10 000 файлов и из них зафейлилось 5% то я считаю что результат копирования - успешен с warnings. В лог-файле будут детали. Это общий рекомендательный смысл. И обсуждать эту задачу в голом контексте try-resources я не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:08 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp mayton, Я мало знаю случаев когда надо гасить по тихому исключения. Я этого не говорил. Вообще Петро у тебя странная привычка - переиначивать сказанное. Хоть квотируй чтоли. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:10 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Stanislav Bashkyrtsev Я правильно понимаю что тут предложение - отдельно обрабатывать исключения от close()? Типично ошибки close() это "какой-то мусор". С другой стороны, эти ошибки могут приводить к утечкам (системных) описателей файлов или/и сокетов. Но это всё равно надо "от проблемы" смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:13 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
mayton PetroNotC Sharp mayton, Я мало знаю случаев когда надо гасить по тихому исключения. Я этого не говорил. Вообще Петро у тебя странная привычка - переиначивать сказанное. Хоть квотируй чтоли. Ты тоже меня переиначивал сегодня. Бывает) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:19 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели. Хотя ... Если так и тянет "ляпнуть умное", то годится любой повод. В Java, если уж оставаться в рамках тематики, есть ссылки разной степени "слабости". Другое дело, что используют их ... Почти никак не используют. Но механизм - есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:19 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
Basil A. Sidorov, Там умные ввели например чтобы кастовать память под другой тип без райзе. Это ведь можно и просто гася исключение как раньше. Было try кастуем catch не наследник .... Стало B *bp = dynamic_cast<B*>(ap); if(bp!= NULL) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:29 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
mayton PetroNotC Sharp mayton, Вот пример из твоего топика. Исключения при создании линков на файлы гасить будем? С другой стороны, в плюсах ради того чтобы взять под контроль исключения пошли совсем другим путем АРХИТЕКТУРНО. Ввели умные указатели. Учитывая что утилита будет копировать десятки тысяч файлов то фейл каждого конкретного копирования (линкования) нас не интересует. Но в финальной статистике он будет учтен. Например если всего было найдено 10 000 файлов и из них зафейлилось 5% то я считаю что результат копирования - успешен с warnings. В лог-файле будут детали. Это общий рекомендательный смысл. И обсуждать эту задачу в голом контексте try-resources я не могу. Ты свой пример не хочешь развить. А я за то чтоб не по тихому) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:35 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, тыж на голом JDBC кодил? Да кодил. Помню хвастался. Так вспомни что ты делаешь при закрытии ResultSet/Statement? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:37 |
|
try-with-resources - шляпа?
|
|||
---|---|---|---|
#18+
mayton PetroNotC Sharp, тыж на голом JDBC кодил? Да кодил. Помню хвастался. Так вспомни что ты делаешь при закрытии ResultSet/Statement? Я хочу чтобы ресурс либо закрылся без исключения, либо с другим типом исключения, либо выведя любое исключение. Как заказчик программист) Вроде все варианты жизненные описал. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2021, 19:40 |
|
|
start [/forum/topic.php?fid=59&fpage=4&tid=2120365]: |
0ms |
get settings: |
7ms |
get forum list: |
5ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
74ms |
get topic data: |
7ms |
get forum data: |
1ms |
get page messages: |
459ms |
get tp. blocked users: |
1ms |
others: | 394ms |
total: | 950ms |
0 / 0 |