|
|
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
подскажите что почитать про исключения, обработку и прочее. интересует серьезный фундаментальный материал да, в каждой типичной книжке по Java есть глава про исключения но меня интересуют действительно знания продвинутого уровня разбор best practices, тонких моментов, и как оно работает внутри можно, конечно, самому как-то копать, но уж больно немало времени это займет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 13:34 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
В части философии механизмов исключений есть некоторое "рыскание". Идёт процесс пересмотра их необходимости. Я не имею в виду Java language. Здесь скорее всего они остаются в деле и надолго. Но сознательно хотел-бы дистанциироваться от Java language и обсудить этот механизм вообще. Несколько отстранённых наблюдений (или фактов): Наблюдение №1. Google Lang (GoLang) сознательно отказались от этого механизма. Заменив его возвратом кода ошибки. http://blog.golang.org/error-handling-and-go Наблюдение №2. Хорстман пишет о Scala language: В Java контролируемые исключения (checked) контролируются на этапе компилляции. Если метод может вызывать исключение IOException, необходимо явно объявить это. Такой подход вынуждает программиста думать, где предусмотреть обработку этого исключения что само по себе является достойным похвалы. К сожалению это может приводить к созданию монструозных сигнатур методов таких как Код: java 1. Многие программисты на Java терпеть не могут эту особенность и в результате либо перехватывают исключение слишком рано, либо используют слишком обобщённые классы исключений. Создатели Scala решили отказаться от контролируемых исключений, признавая что полные проверка на этапе компилляции не всегда оправдана. Наблюдение №3. Брюс Эккель пишет о механизме Exceptions в Python. авторIn Python, exceptions are unchecked, and you can catch them and do something if you want, but you aren't forced. And it seems to work just fine. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 17:00 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
mayton, Ну, в Ada и pl/sql тоже нет следов "checked exceptions" и воркинк джаст файн - никто не жалуется. У Эккеля в этом абзаце существенно важнее предложения этот абзац начинающие, а не заканчивающие. http://www.mindview.net/Etc/Discussions/CheckedExceptions [/]Нужны ли Яве контролируемые исключения Нужны ли Яве контролируемые исключенияChecked exceptions seem like a really good idea at first. But it's all based on our unchallenged assumption that static type checking detects your problems and is always best. Java is the first language (that I know of) that uses checked exceptions and is thus the first experiment. However, the kind of code you must write around these things and the common phenomenon of "swallowed" exceptions begins to suggest there's a problem. Это не просто "первый эксперимент", а такой "первый эксперимент", который больше никем не был повторен. То есть ошибка (одна из) проектировщиков языка. Касательно Go - существо дела здесь видится не в том, что GO хочет вернуть программиста во времена возврата кодов ошибок в C, с немедленными проверками результата по вызову функции, а в том, что предоставляет программисту первоклассный тип, определенный в базовом синтаксисе языка ( т.е. - часть внутренней общеязыковой библиотеки), позволяющий протягивать иформацию об ошибке сквозь набор вложенных функциональных вызовов. Т.е. - шаблон проектирования а-ля "старый добрый С" может быть реализован с разбегу. Но проектировщики GO закладываются и пропагандируют "функциональный" подход к проектированию программ и обработке ошибок в них: они мягко предлагают разработчику код, внутри которого может происходить ошибка, формулировать в виде самостоятельной лямбды, возвращая информацию о ней в виде известного компилятору навсегда единого типа данных. И обрабатывать эту информацию в отдельном блоке кода по завершению вызова той лямбды. Это 100% тот самый подход, который сейчас проникает в Java через форточку, открытую в 8-ке путем вживления а-ля лябд (синтаксически - так именно лямбд). Только в Java всю эту механику (пока?) нужно реализовать своими ручками, объявив подходящие клиентские классы для проброса информации об ошибке из лямбды в вызывающий код. PS про checked exceptions в Java - с одной стороны, мне еще продолжает казаться что они из Java будут выведены только вместе с выносом самой Java из массовой практики кодирования. С другой стороны, глядя на то, какой кинжал сейчас всобачивается в сердце унаследованного Java-кода путем заявления к выходу "модульной" Java-9, я уже готов поверить, что к выходу какой-нибудь Java-13 будет сказано - забудьте про checked exceptions - больше этот синтаксис мы не поддерживаем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 20:25 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Если принуждение разработчика к соблюдению протокола декларации - это только опция компиллятора - то ее можно легко выпилить просто смягчив проверки фазы компилляции. Для меня к примеру совершенно неочевиден МЕТОД которым я должен отработать InterruptException. Я по сути не знаю как его отработать. Только Хорстман помнится писал о том что нужно вызвать потоковый interrupt() внутри. Хотя многие этого не соблюдают. Или же выпиливаение можно оформить как Warning фазы компилляции. Но при этом компиллятор всё-таки выдаёт нам результат (компилирует успешно) хотя и предупреждает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 21:30 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
mayton, тебе будет интересно: вот интервью 2003 года, http://www.artima.com/intv/handcuffs.html при несколько вольном пересказе получится так: Брюс Эккель спрашивает а Андерса Хейлсберга - как же это вам удалось не вляпаться в checked exception при проектировании С#? - ведь "зашибись-идея" - тогда так все думали. - Ну, правда - мы искренне считали это "зашибись-идеей". Тогда что-то удержало, а теперь я всем рассказываю, что не верю в масштабируемость кода, построенного на таком синтаксисе. Эккель не просто троллит Хейлсберга, а троллит, обладая точным знанием, что до создания C# Хейлсберг занимался в Microsoft реализацией J++. Т.е. в смысле бытовой психологии у него практически не было шансов не перетащить "клевую фишку" в новый язык. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 21:41 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
boobymayton, тебе будет интересно: вот интервью 2003 года, http://www.artima.com/intv/handcuffs.html Спасибо. Я читану чуть позже. Надеюсь что это не будет представлять археологический интерес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 23:06 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
grokда, в каждой типичной книжке по Java есть глава про исключения но меня интересуют действительно знания продвинутого уровня разбор best practices, тонких моментов, и как оно работает внутри Дабы не было много оффтопа я всё-таки попробую немного ответить на главный вопрос который спросил автор. Я честно не знаю таких книг где-бы описывались знания "продвинутого уровня". Скорее всего тема исключений в вакууме вообще не существует как объект для монографий. Слишком много чести - растекаться мыслями по бревну ради этой опции. Но мне лет 10 назад дали ценный совет по отработке исключений. Вобщем если рассматривать ПО как стек уровней то ты должен обрабатывать исключение только на том уровне на котором ты в состоянии "принять решение". Например CSV-парсер при получении ошибки I/O ничего не может сделать. Он может просто экскалировать эту ошибку наверх. На тот уровень который управляет вызовом CSV-парсера и соотв. может решать что делать дальше. Повторить загрузку CSV-файла. Или отложить. Или тот-же CSV-парсер при отработке преобразования String=>Int (NumberFormatException) вполне себе может принимать решения. Например игнорировать "битые" числа (вести учёт ошибок или складывать в Logger битые строки). В последнем кейсе CSV парсер не сигналит от этом через throw. Что еще добавить здесь? Не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.03.2016, 23:16 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
mayton...Надеюсь что это не будет представлять археологический интерес. Это тебе решать... хочу вот на что предложить обратить внимание - работа взаимодействующих компонентов, в общем случае - в разных процессах (явно упоминается в интервью). - работа "твоего" кода из-под неуправляемого тобой хост-приложения, когда необработанная ошибка в твоем коде может приводить к аборту всего хоста. В обоих случаях не типизированный до checked (уровня compile-time) try-catch - это доктор, который в одном catch спрашивает у полученного объекта ошибки (runtime) - родной, так что же в том вызове не так приключилось? Т.е., с точки зрения вызывающего ошибка, - это возможная, ожидаемая часть данных , приезжающая из вызова. "Красота" compile-time checked захода, явленная в виде ветвистого наследования типов ожидаемых ошибок не только обязывает вызывающего знать их все наперечет (только для того, чтобы скопипасть нужное количество раз вывод текста сорта "оно там не смогло сработать, и я об этом знаю в своей собственной, отдельной для этой конкретной разновидности не срабатывания ветке кода "), но и обязывает передавать такого рода знание дальше по стеку вызова, если внутри текущего блока не находится разумного способа обойтись с обнаруженной проблемой, навязывая вышележащим слоям из ниоткуда появившуюся необходимостью иметь информацию времени компиляции об устройстве нижележащих слоев. Это особенно радует с учетом того обстоятельства, что compile-time информация о вызываемом может быть подставой чистой воды. Что за радость получить скомпилированный код и крашнутое приложение, вместо возможности обработать runtime-error без краха вызывающего? Разработчики Go/Golang всего лишь сказали следующее: ну и нафига нам вообще вся эта лабуда, включая unchecked, в конце концов. Если информация об ошибке - часть данных , приезжающая из вызова, не проще ли информацию об ошибке явно инкорпорировать в состав возврата, получаемого из вызываемого кода. Выбросим-ка мы все это добро разом, вместе с обсуждением о "состоянии" системы в момент вхождения в блок catch, напоминаниями разработчику о том, что не есть хорошая идея использовать try-catch для управления бизнес-кодом (а нескромный вопрос - зачем тогда вообще придумывать управляющие конструкции - неужели только для того, чтобы писателю книжек всегда было обеспечено несколько страниц, на которых он тщательно объяснит, почему ими не надо пользоваться?). Для управления кодом есть ясный и понятный if. А вот в куда этот if должен двигаться - имеет право определяться приехавшими из вызова данными. Что тут скажешь - с одной стороны - всего 60 примерно лет потребовалось, чтобы претворить это в синтаксис, с другой стороны си-писатели имеют право хмыкать - мы с самого начала так и работали, да еще и совсем без перегрузки нашего рантайма подсистемами пропагации ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 00:29 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonто ты должен обрабатывать исключение только на том уровне на котором ты в состоянии "принять решение". +1 поэтому, всё с исключениями обстоит нормально. А теория очень сильно зависит от конкретики. Увы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 11:34 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Исключения - часть семантики. По-этому checked exceptions и были придуманы. Что касается InterruptedException - https://www.ibm.com/developerworks/ru/library/j-jtp05236/ boobyДля управления кодом есть ясный и понятный if. А вот в куда этот if должен двигаться - имеет право определяться приехавшими из вызова данными. Вот уж достижение - на каждый вызов по if. Код мгновенно становится ясным и понятным, легко сопровождаемым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 12:29 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
booby Эккель не просто троллит Хейлсберга, а троллит, обладая точным знанием, что до создания C# Хейлсберг занимался в Microsoft реализацией J++. Т.е. в смысле бытовой психологии у него практически не было шансов не перетащить "клевую фишку" в новый язык. Хейлсберг не ребёнок- развитие pascal в borland было очень разумным. Он, хотя бы, изучил вопрос, а не стал тупо копировать ущербный С++, как Гослинг (один Result и именованные конструкторы чего стоят- хотя контракты они так и не сделали). Но тут я не согласен- checked exception это хорошая абстракция, годная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 17:02 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
booby Разработчики Go/Golang всего лишь сказали следующее: ну и нафига нам вообще вся эта лабуда, включая unchecked, в конце концов. Если информация об ошибке - часть данных , приезжающая из вызова, не проще ли информацию об ошибке явно инкорпорировать в состав возврата, получаемого из вызываемого кода. И как это работает в случае деления на ноль? А ошибка чётности памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 17:04 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Alexey TominА ошибка чётности памяти? А как современный разработчик должен реагировать на ошибку чётности памяти? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 18:20 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonДля меня к примеру совершенно неочевиден МЕТОД которым я должен отработать InterruptException. Я по сути не знаю как его отработать. А зачем его обрабатывать? Общий принцип простой: если не знаешь - надо выпускать наверх, наверху знают. Если наверх выпускать нельзя (например мы в runnable) - то все. Можешь никак не обрабатывать, можешь в лог ругнуться. В чем вообще проблема? maytonА как современный разработчик должен реагировать на ошибку чётности памяти? На такое среагировать должна операционка. Но предположить, что такое могло быть в коде - значит надо просто вываливаться наверх, согласно тому же принципу. Непонятно, почему oracle до сих пор не отказался от checked-экзепшенов. Обратную совместимость это не нарушило бы, а жизнь упростило бы сильно. В части философии механизмов - да, неудобно. Недостает инструмента "перезапуска с (почти)того же места". Фактически, точка, в которой исключение ловится и точка перезапуска - это одна точка, а если б можно было эти два понятия как-то разделить, то было бы гораздо удобней. Например, там, где возникло FileNotFoundException - обработчик мог бы подставить следущий из списка каталог и возобновить. Или в примере с СSV-файлом. Допустим, 100гб пропарсено из потока - и возникает IOException. Жалко проделанной работы. Вот если б экзепшен вывалился со списком ExecutionPoint-ов и можно было бы что-то подкрутить (включая локальные переменные потока с экзепшеном) и сказать "а теперь продолжай с вот этого ExecutionPoint" - это было б удобно. Просто, реализация такого механизма сильно подпортит перфоманс, поэтому его не делают. Если такое поведение нужно - то проще заложить его в алгоритм парсинга. Поэтому тот механизм обработки, что есть - это своего рода компромисс, обеспечивающий приемлемое удобство без провалов в производительности. p.s. В Idea в режиме дебага есть кнопочка drop frame, она делает частично это. Можно с какого-то места повторить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.03.2016, 19:45 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
[quot Alexey Tomin]booby ... Но тут я не согласен- checked exception это хорошая абстракция, годная. Об этом лучше не мне рассказывать ( я на java не программирую), а сразу (на выбор) Блоху, Эккелю или Гетсу. Тем более, что каждый из них обладает ясным представлением мотивации, приведшей к стандартизации этой штуки в синтаксисе языка. Мое же имхо, состоит в том, что в системах программирования с использованием подсистем управления исключениями с 1980 года ничего не произошло в том смысле, в каком тогда Хоар хотел их "почистить". Тогда - применительно к Ada как кандидату на безопасный язык. Всего-то и оставалось, что привести в порядок exception handling до степени, достойной "безопасного языка" и можно, не боясь, Ada в каждый танк засовывать. А без этого ракеты до Венеры не будут долетать, а в городах начнут самопроизвольно взрываться атомные бомбы. Как тогда, так и сейчас наличные подсистемы не могли гарантировать декларативным образом (т.е. нельзя было написать гарантирующий это компилятор), что полученная программа - не испытает краха из-за отсутствия обработчика верхнего уровня - полученная ошибка будет обработана в "правильном месте" и "правильным образом" - Попытка Java в этом смысле навязать разработчику обязанность разбираться с тем, что проектировщики ( кхм... а тут уже не языка, а библиотечной части, что является совершенно отдельной частью Марлезонского балета) посчитали необходимым обязать его разбираться, хоть и бравая, но сама по себе не может служить и не является гарантией вообще ничего, кроме 100% резервированного места под try-catch. Исключения вносят в код семантику косвенного управления. Разрывая "естественные" границы единиц кода. Превращая семантику вычисления в необозримую. Попытка проверяемых исключений локализовать обязанность по обработке таких исключений не меняет существа дела как потому, что допускает возможность их пере-испускания на верхний уровень, так и потому что обычные, не проверяемые, исключения при этом не перестают существовать. Даже там, где требование компилятора сработало и ошибка оказалась обработанной в месте своего возможного появления, у компилятора нет никаких ресурсов установить, что обработана она была правильно с точки зрения заявителя такой ошибки - открытый файл окажется закрытым и бомба самопроизвольно не взорвется. Иначе не было бы никакой нужды спустя 20 лет от реализации такой зашибись-возможности вживлять в язык try-with-resources То есть существо дела в том, что это не работа "доказывающего правильность программы безопасного" компилятора, а всего лишь хинт программисту - тут у тебя бяка заготовлена - смотри там - не проморгай. Причем хинт в виде зубной боли (или, как пишут особо креативные англоязычные коллеги- заносы в заднице). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 06:22 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 08:17 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonДля меня к примеру совершенно неочевиден МЕТОД которым я должен отработать InterruptException. Я по сути не знаю как его отработать. Неправда . Вы получили сигнал о досрочном завершении и вы не знаете, что надо делать в вашем коде??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 08:42 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonAlexey TominА ошибка чётности памяти? А как современный разработчик должен реагировать на ошибку чётности памяти? Обычно никак. Но может быть ньюанс. Но я другой вопрос задал. Если язык заявляет что "у нас исключений нет", то они должны как-то разрулить исключения, выбрасываемые процессором. Т.е. метод Код: sql 1. должен возвращать уже пару (double, error). Причём ДАЖЕ ЕСЛИ вызывающий ГАРАНТИРУЕТ, что b != null. Как раз ГОшный механизм ГОден для "контролируемых исключений" :) типа IOException. А вот для Runtime (NPE, деление на ноль) он ОЧЕНЬ НЕУДОБЕН - из-за того, что его надо ВЕЗДЕ ждать. Как раз суть деления исключений на 3 части в java - это деление на "это надо ждать и быть к этому готовым", "с этим дальше разберёмся, если что" и "конец света это не наша проблема". При том, что какой-нибудь кэш вполне может ловить OutOfMemoryError и освобождать часть кэша. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 10:46 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Alexey TominПри том, что какой-нибудь кэш вполне может ловить OutOfMemoryError и освобождать часть кэша. Один из вариантов предлагают на http://stackoverflow.com/questions/2679330/catching-java-lang-outofmemoryerror Я-бы добавил что мы ограничены в выборе действий внутри блока catch. Тоесть мы должны исходить из того что new Something() требуемого размера уже не работает. С гарантией могут только отработать native вызовы к примеру. Или как говорил Дядя Фёдор - чтобы продать что нибудь ненужное - надо купить что нибудь ненужное а у нес денег нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 14:36 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Alexey TominКак раз суть деления исключений на 3 части в java - это деление на "это надо ждать и быть к этому готовым", "с этим дальше разберёмся, если что" и "конец света это не наша проблема". С концом света разобрались. По поводу исключений 1 и 2 типов. Не слишком ли высокую цену заплатили разработчики Java? По сути механизм try{} catch нам представляется мощным макро-процессором для многочисленных Код: java 1. Но является ли плата за его обязательное декларирование и обработку ГАРАНТИЕЙ надёжности кода. Тоесть мы обязаны надёжности Java-коду благодаря ОБЯЗАТЕЛЬНОЙ отработке протоколов контролируемых исключений или надёжность была ВСЕГДА а протокол это просто РИТУАЛ который мы каждый день исполняем просто так... потому что Гослинг и иже с ними так решили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 14:51 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
а какова плата за использование эксепшнов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 15:37 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
mayton... или надёжность была ВСЕГДА а протокол это просто РИТУАЛ который мы каждый день исполняем просто так... потому что Гослинг и иже с ними так решили. Все наоборот. Любая система построенная на пробросе и "управлении обработкой" исключений - с гарантией ненадежна . И сам Гослинг никогда не был и не есть "глупый человек". Ну, может быть, он всего лишь "недостаточно гениальный". Это на самом деле была бравая попытка внести в синтаксис языка, прямо в сигнатуру метода, список возможных исключений, возможно генерируемых методом с тем, чтобы, как казалось, через такое усовершенствование усилить надежность получаемого кода. Это не дало фактического увеличения надежности, не создало инструментов доказательства надежности кода поверх такого захода и, по факту, привело к замусориванию кода. В то, что это "зашибись-идея" тогда на самом деле думали "все". Страуструп на абсолютно полном серьезе, под давлением "комитета" или без, но много лет планировал ввести эту "клевую фишку" в С++. Окончательно эта идея умерла в мире С++ совсем недавно - лет пять назад - не более. Сейчас не могу привести ссылку, но где-то но где-то Хоар высказывался в таком духе, что что в смысле надежности языка на первом месте стоит даже не проблема обработки ошибок, а, куда более простая, проблема не инициализированных переменных. Так вот Хоар винил лично себя (не Вирта), говоря о том, что лично совершил многомиллиардную ошибку (стоившей все отрасли много миллиардов потерь из-за автоматического непрерывного воспроизведения в языках-последователях), разрешив в ALGOL W сравнения указателей с null. "Безопасная" Java прошла мимо сего обстоятельства, даже не заметив его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 16:04 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonЯ-бы добавил что мы ограничены в выборе действий внутри блока catch. Тоесть мы должны исходить из того что new Something() требуемого размера уже не работает. С гарантией могут только отработать native вызовы к примеру.Я, конечно, дико извиняюсь, что встреваю в высокоинтеллектуальную эскападу, но стратегии "OOM-парашюта" уже очень много лет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 16:14 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
booby Любая система построенная на пробросе и "управлении обработкой" исключений - с гарантией ненадежна Вас кто-то обманул, т.к. механизм исключений не является гарантом надёжности чего-бы то ни было. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 16:18 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovbooby Любая система построенная на пробросе и "управлении обработкой" исключений - с гарантией ненадежна Вас кто-то обманул, т.к. механизм исключений не является гарантом надёжности чего-бы то ни было. такая формулировка тоже годится, даже если кто-то меня обманул. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 16:23 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
boobyтакая формулировка тоже годится, даже если кто-то меня обманул... только все ваши горячие выпады - идут лесом. P.S. Царская Россия, юрфак, старый профессор (внутренне негодуя - не бабское это дело) экзаменует студентку. Студентка отлично отвечает и профессор решает задать шокирующий вопрос, чтобы, таки, поставить неуд. П. - Если бы я попытался вас изнасиловать, то как бы вы квалифицировали мои действия? С. - Как попытку с негодными средствами! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 16:29 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Usmangrok, http://neerc.ifmo.ru/wiki/index.php?title=Обработка_ошибок_и_исключения спасибо. в принципе, кое-что новое для себя узнал. например, вот это не знал: авторNB: Если JVM выйдет во время выполнения кода из try или catch, то finally-блок может не выполниться. Также, например, если поток выполняющий try или catch код остановлен, то блок finally может не выполниться, даже если приложение продолжает работать. но всё же остались вопросы. в основном по "best practices" 1) оборачивать почти все стандартные исключения в свои - допустимо ? 2) rethrow без оборачивания - нормальная практика ? 3) логирование в конструкторах исключений (своих) - нормально ? 4) нормально ли разделять обработку исключений ? т.е. обработали на одном уровне, rethrow, потом другая обработка на уровне выше 5) и вопрос из области "как работает" как формируется stackTrace ? через fillInStackTrace ? я правильно понял ? возможно это не все вопросы, просто то, что вспомнил сходу. ну, вы поняли, чего мне примерно хочется. PS: к срачу про checked, моё скромное мнение. не стоит оно того, ловить всё на этапе компиляции. пусть программа падает, лишь бы красиво и информативно. ведь есть такая штука как тесты. специальное место где падать. а то что не поймалось тестами, не думаю что словите и на компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 17:02 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
grok1) оборачивать почти все стандартные исключения в свои - допустимо ? 2) rethrow без оборачивания - нормальная практика ? 3) логирование в конструкторах исключений (своих) - нормально ? 4) нормально ли разделять обработку исключений ? т.е. обработали на одном уровне, rethrow, потом другая обработка на уровне вышеJava SE API в целом и исключения, в частности, не могут использоваться "в общем". Надо смотреть конкретную ситуацию и думать, что делать "прямвотздесь". Скажем, в сервлете: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. совершенно нормально: если возникла исключительная ситуация, то не надо гадать гадать на кофейной гуще можем ли мы продолжить работу - просим контейнер информировать клиента о случившейся неприятности и закругляемся. И это правильное решение, но для его принятия требуется некоторое знание предметной области и (что важно) - представление о реальной жизни. Нужно ли протоколировать эти ошибки? Чтение запроса - скорее нет, ошибку обработки запроса - скорее да. Печатать ли трассу стека? А для чего? Если строчки в логе недостаточно для идентификации места ошибки, то у вас ещё и протоколирование хреновое.5) и вопрос из области "как работает" как формируется stackTrace ? через fillInStackTrace ? я правильно понял ?Если никто не обработал исключение, что JVM сделает это без вашей помощи. Если исключения обрабатываются, то трасса стека - не лучший вариант. Таким образом, появление трассировки стека должно свидетельствовать об ошибке, а не быть частью штатной работы системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2016, 18:31 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonНо является ли плата за его обязательное декларирование и обработку ГАРАНТИЕЙ надёжности кода. Нет. Но мне это кажется удобным. Контролируемые исключения не должны кидаться "далеко"- их надо быстро обрабатывать, либо исправляя ошибку, либо превращая в неконтролируемые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2016, 07:56 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
В качестве небольшого отвлечения. Некоторые читатели топика Java никогда не кодили на С/C++. Я приведу пример классического приложения на С (сокет-клиент) со ссылкой на http://www.linuxhowtos.org/data/6/client.c Обратите внимание на количество строк кода. Codeblocks отработки ошибок сетевого уроня я отметил желтым маркером. Обратите также внимание на функцию error которая является некой точкой агрегации всех ошибок. По сути она не делает ничего интересного кроме печати месседжа об ошибке и делает аварийный выход из main к возвратом кода 0 в ОС. По сути она является аналогом catch() блока. Код: plaintext 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. Особняком стоит функция gethostbyname() (). В данном коде она тоже решает вопросы сетевого уровня но не отрабатывает кода ошибок через perror () Если у вас есть другой исходник для реализации тривиального клиент-сервера на С/C++ то я заранее не возражаю. Я просто акцентирую внимание на том что данный способ или парадигма кодинга продолжает использоваться и в настоящее время. Прошу каменты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2016, 17:43 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonили парадигма кодинга продолжает использоваться и в настоящее время. это только для узких случаев: - стека практически нет. Один уровень в main - БЛ нет и управлять исключительными ситуациями не надо. Весь код не делает ничего интересного кроме выплёвывания ошибок в выходной поток. - т.к. высокая производительность, то в жертву принесено всё остальное удобство от ООП до try и т.д. т.п. ЗЫ Прикладной код с поведением пишется совсем по другому. У данного кода только 2 состояния - ВКЛ\ВЫКЛ Такое вполне можно применять напр. при сериализации. Будет 2 состояния: Поучилось и НЕполучилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2016, 19:36 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Petro123maytonили парадигма кодинга продолжает использоваться и в настоящее время. это только для узких случаев: - стека практически нет. Один уровень в main стек здесь возникает на каждом вызове библиотечной процедуры. Petro123- БЛ нет и управлять исключительными ситуациями не надо. Весь код не делает ничего интересного кроме выплёвывания ошибок в выходной поток. Бизнес логика здесь состоит в передаче текста переданного в качестве параметра сообщения на указанный во входном же параметре хост. Это код и делает. А "выплевывание" чего-то во входной поток - это побочный результат деятельности функции. В общем случае страшно порицаемый изобретателями методик "структурного" программирования. Petro123- т.к. высокая производительность, то в жертву принесено всё остальное удобство от ООП до try и т.д. т.п. как можно принести в жертву "удобство ООП" в языке, который про "ООП" ничего не знает? Это как Ликург в Спарте в 8м веке до нашей эры принес в жертву удобство использования криптовалюты в интернете, методом запрета денег, сделанных из золота. В жертву здесь принесена возможность использования представленной функции в сколько-нибудь развитых скриптах автоматизации. Путем возложения на саму функцию задачи "выплевывания" чего-то в выходной поток. Что при другом заходе должно было бы стать обязанностью того самого скрипта. Petro123ЗЫ Прикладной код с поведением пишется совсем по другому. У данного кода только 2 состояния - ВКЛ\ВЫКЛ Такое вполне можно применять напр. при сериализации. Будет 2 состояния: Поучилось и НЕполучилось. Вы ошибаетесь. В смысле выходного состояния у этой функции одно состояние. Всегда ВКЛ. Все получилось. Могло бы быть и два и больше - прямо по тексту вычитывается как минимум пять разумных состояний возврата, но автор кода решил обойтись одним. Принципиально в контексте обсуждения именно checked exceptions не вопрос о том - является ли здесь выдача единственного результата ошибкой программирования (имхо - является, но не это критично важно для безопасного программирования), а вопрос о том, не разрушается ли весь локальный мир всего того адресного пространства в котором запускается этот код при неудачном вызове. И ближайшим кандидатом на разрушение мира в этом коде является фрагмент Код: java 1. 2. 3. в котором не происходит попытки закрыть неудачно открытый сокет. Просмотра только этого фрагмента в общем случае недостаточно, чтобы дать ответ - идет здесь речь о прямой ошибке программирования или нет. Потребуется знание не только реализации функции socket, но и знание деталей устройства конкретной операционной системы, в рамках которого код может оказаться вполне безопасным в смысле блокировки/потери ресурса. Вероятно, рассматривание кода примерно такого сорта сорта и должно наводить на желание вписать прямо в контракт функции socket обязанность по обработке контролируемого исключения. Но ровно этот же код и показывает пример того, насколько бесплодна затея, если программист поставил себе твердую цель потушить полученную информацию методом недеяния, игнорирования результата. (Зачем-то для чьих-то досужих глаз записывая некий мусор в лог. Конечно, когда система полностью встанет от полной блокировки ресурсов - появится заинтересованный читатель полученных логов с приветами от программиста. А вот у этого заинтересованного читателя ответить письменным образом "в лог программисту" может не оказаться возможности.) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2016, 02:09 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
неожиданно сам тут нарыл Best Practices for Exception Handling http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html правда, оно весьма старое. может устарело там чего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2016, 23:50 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
grokнеожиданно сам тут нарыл Best Practices for Exception Handling http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html правда, оно весьма старое. может устарело там чего. в комментариях к статье обнаружился коммент авторJust crap, read http://today.java.net/pub/a/today/2006/04/06/exception-handling-antipatterns.html instead хм. надо будет и это почитать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 00:01 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonПрошу каменты. Код: sql 1. Модно, стильно, молодёжно. P.S. В це изначально есть не только еггог, но и setjump/longjump, которые представляют собой несколько усовершенствованный оператор перехода из ассемблера. А вся "обработка ошибок" примера сводится к "чуть что - дать дуба". Так тоже можно, но приводить такой подход в качестве примера можно только на первых уроках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 19:23 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Тезис о высокой производительности я-бы предложил "раскрыть". Действительно-ли наличие механизма try{...}catch является ударом по перформансу или есть другие точки зрения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 19:33 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Если код исполняется не более пяти процентов времени, обсуждение производительности такого кода становится чистой схоластикой. P.S. Схоласты, напомню, обсуждали количество чертей, которые могут поместиться на кончике иглы и прочие столь же полезные и, главно, актуальные вещи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 19:37 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonТезис о высокой производительности я-бы предложил "раскрыть". Действительно-ли наличие механизма try{...}catch является ударом по перформансу или есть другие точки зрения? Ударом по производительности является разворачивание всего стэка для вычисления stacktrace, в связи с чем в JVM имеется оптимизация, которая после N вычислений stacktrace одного и того же вычисления перестаёт этой дурью заниматься. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 19:43 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, количество ангелов вроде. 2 all Можно предположить что механизм try-catch можно считать производительным когда у нас есть соотношение к примеру 95% : 5% в чести успехов/неуспехов в блоке try Обычно касается парсеров которые в цикле чёто преобразуют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 20:06 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
mayton.. Можно предположить что механизм try-catch можно считать производительным когда у нас есть соотношение к примеру 95% : 5% в чести успехов/неуспехов в блоке try ... ну, в пару кликов можно найти утверждения (касающиеся, возможно, устаревших версий java), что генерация/обработка исключений может быть примерно в 200 раз дороже кода, полностью лишенного исключений. т.е твое соотношение должно быть 99.95%:0.05% на сайте Михаила Воронцова любопытный разбор методов кодирования/декодирования в/из Base64 Самыми медленными - от 3.5 до 50 раз в зависимости от размера кодируемого по отношению к ближайшим конкурентам оказываются самые секретные sun.misc.BASE64Encoder и sun.misc.BASE64Decoder (ну, и самые древние). По единственной причине - оба используют механизм исключений как элемент своей управляющей логики. http://java-performance.info/base64-encoding-and-decoding-performance/ У него же есть обзор - на что в комбинации try - throw new CustomException("Horror!") - catch уходит время. То, что try в любой системе с исключениями почти или полностью бесплатен - легко ожидать. У catch самого по себе тоже нет оценки времени. Все время так или иначе уйдет на механику получения точки catch, переход на нее и передачу информации о самой отлавливаемой ошибке. Т.е. В любой системе время будет концентрироваться вокруг throw new CustomException("Horror!") На основании своих замеров Михаил утверждает, что сам по себе throw тоже практически несущественен. Все время целиком уходит на new CustomException("Horror!"). При этом, если подавить механику формирования трейс-стека при конструировании объекта - ситуация улучшается в 10 раз, а если отказаться от new (или даже вообще от extends Exception для формирования объекта, несущего информацию об ошибке), то еще в 10 - 30 раз по отношению к предыдущему 10-кратному улучшению. Т.е. в Java создание объекта исключения для переноса простой информации - чистопородное эстетство. http://java-performance.info/throwing-an-exception-in-java-is-very-slow/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2016, 23:37 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
booby, а Воронцов сравнивал sun.misc.* c восьмерчатыми java.util.Base64 ( https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html ) ? Были-ли ценные improovements воплощены в новых версиях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 00:10 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
mayton, сравнивал - они у него и есть рекомендуемые для тех кто хочет стандартных решений, ну или на втором месте после javax.xml.bind.DatatypeConverter - это для гиков и тех, у кого еще нет 8-ки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 00:14 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Если честно я всегда испытывал дискомфорт от отказа компиллятора собирать try{...}catch(){} когда комментаришь какой-то пустяк и вдруг понимаешь что надо комментарить всю секцию catch() а поскольку она - единственная - то надо убирать и try. Здесь надеюсь сишники меня поймут. Все мы люди и не всегда пишем ПО с 0 до 100%. Всегда есть какая-то фаза проб и ошибок. Элементарно даже юзкейс нового неизвестного компонента может не иметь документации. И вобщем-то когда я комментарю строку я логически предполагаю что мое действие которое я УБРАЛ не должно вызывать side-effects. А оно вызывает ибо контракт предполагает ОБЯЗАТЕЛЬНОЕ протокольное декларирование IO-эффекта. Вот такая досада. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 15:22 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. прошу так же освятить тему пропавшего Exception при использовании в конструкции finally и так же вариант решения данной проблемы через Suppressed массив e.getSuppressed() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:00 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Atum1, это комилится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:51 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonЕсли честно я всегда испытывал дискомфорт от отказа компиллятора собирать try{...}catch(){} Судя по всему, ты говоришь о способностях компилятора производить преобразования структуры программы не нарушая вычислительную эквивалентность результата. В моей практике "не-ява" программирования мне, наоборот, приходится чаще печалиться от того, что свежую версию компилятора кто-то шибко образованный с тщанием обучил паре новых "офигительных" фишек по оптимизации кода. Что-то ни разу у меня не оказалось сомнений в вопросе о том - просил ли я об этом того умельца. Даже если он считает, что код "бесполезный" и его можно "оптимизировать" методом полного выкидывания - это не его дело (имхо). Я программист, и я решаю - на что жечь, а на что не жечь процессорные такты. Я, рано или поздно, эти такты все равно сожгу. Зачем ему надо, что бы я поминал его при этом "добрым словом"? maytonкогда комментаришь какой-то пустяк и вдруг понимаешь что надо комментарить всю секцию catch() а поскольку она - единственная - то надо убирать и try. на первый взгляд - не вполне ясно - о чем печаль. Твоя рука - владыка. Ты владелец внутренней структуры своей программы. mayton.... И вобщем-то когда я комментарю строку я логически предполагаю что мое действие которое я УБРАЛ не должно вызывать side-effects. А оно вызывает ибо контракт предполагает ОБЯЗАТЕЛЬНОЕ протокольное декларирование IO-эффекта. Вот такая досада. Ну, исключение вызова, из которого приходит checked-exception само по себе не требует изменения контракта вызывающего метода. Ты можешь (должен, если это имя зарезервировано для взаимодействия с внешним для компонента миром) продолжать сообщать миру о возможности выброса теперь уже невозможного исключения. Печаль здесь возникает от того, что там где никому, кроме себя, не должен - во внутренностях компонента, исключение исчезнувшего checked-exception из контракта метода вызывает нелокальные изменения в исходном коде потенциально обширного компонента. Оно конечно, ООП без SOLID (написанное пером - не вырубишь топором) не жилец. Но не до такой же степени, что аж полиморфизмом этого нельзя поправить. А так да - это замечтательная идея - включить в контракт языка список проверяемых исключений метода. Специально для того, чтобы первое же рожденное в этом языке правило большого пальца звучало так: - Никода не создавай собственных checked exception А второе эдак: - Поймав чужое - никогда не выпускай его наружу в первородном виде. То есть они есть , но ты в своих контактах никогда их не используй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:56 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
booby, контактах = контрактах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 16:59 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonBasil A. Sidorov, количество ангелов вродеС кончиком иглы, да - ангелы. Но и про чертей была какая-то тема.Можно предположить что механизм try-catch можно считать производительным когда у нас есть соотношение к примеру 95% : 5% в чести успехов/неуспехов в блоке tryДа нельзя этого предполагать. Если исключение может возникнуть и должно быть обработано, то вопрос производительности механизма исключений нас не волнует. Напрочь не волнует.Обычно касается парсеров которые в цикле чёто преобразуют.Они вот так прямо каждую итерацию исключением завершают или, всё-таки, о проблемах сигнализируют? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 18:16 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovОни вот так прямо каждую итерацию исключением завершают или, всё-таки, о проблемах сигнализируют? Ну... я часто встречал подобный паттерн: Код: java 1. 2. 3. 4. 5. 6. 7. И мне интересна его стоимость с точки зрения реализации. И мне также интересно другое. Если исключение (exception) это с обще-человеческой точки зрения ситуация редкая. То разработчик иногда создаёт ситуации когда это т.н. исключение будет правилом. Тоесть будет почти 100% срабатывать. Вопрос философии или филологии мы отложим в сторону. А хотелось-бы сделать финт ушами чтобы гарантировать ну... не очень сильную просадку перформанса. Возмоно даже отказаться от SimpleDateFormat и заменить его чем-то не таким ... эээ дорогим чтоли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 18:34 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
maytonНу... я часто встречал подобный паттерн: Код: java 1. 2. 3. 4. 5. 6. 7. И мне интересна его стоимость с точки зрения реализации... хотя это случай "может и должно". Разработчик решил, что его парсер не будет падать по каждому чиху. Еще разработчик решил, что он не будет заниматься самостоятельной валидацией входных данных. Совместно эти решения не оставляют выбора - штатный разбор данных может выкинуть исключения и, чтобы не упасть, мы обязаны перехватить это исключения. Выбранная стратегия обработки - увеличить счётчик ошибок. Априори - ничем не хуже и не лучше других.И мне также интересно другое. Если исключение (exception) это с обще-человеческой точки зрения ситуация редкая. То разработчик иногда создаёт ситуации когда это т.н. исключение будет правилом.Нет по обоим пунктам. Генерация исключения - способ сообщить о проблеме так, чтобы это сообщение нельзя было игнорировать . Но способ сообщения о событии вообще никак не связан с частотой событий - если возвращать код ошибки, то события будут происходить также часто. Ну или также редко. Разработчик не делает исключение правилом: если появился try-блок, то это информация "всё в порядке, я знаю, что делать". Если try-блок отсутствует (разработчик не знает что делать), то компилятор заставит вас или обработать все контролируемые исключение или сообщить, что ваш в вашем коде эти исключения могут возникнуть. В общем - "принцип печёной картошки": не можешь удержать сам - перебрось другому ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 19:05 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
P.S. Читал, что в плюсах простое появление try-блока автоматически создаёт постоянные накладные расходы. В ява, насколько я понимаю, основная доля этих расходов "перенесена" на сборку мусора. Соответственно, если уж мы миримся (готовы мириться) со сборкой мусора, то протестовать против исключений - глупо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2016, 19:10 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. прошу так же освятить тему пропавшего Exception при использовании в конструкции finally и так же вариант решения данной проблемы через Suppressed массив e.getSuppressed() Petro123Atum1, это комилится? можно так : Код: java 1. 2. 3. 4. 5. 6. 7. + куча задач на понимание всего этого + в JDK 7 Suppressed ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 17:33 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 17:36 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
второй вопрос ка узнать что исключение произошло ? т.е. что мы попали в блок с return 3; ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 17:38 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Atum1как получить 3 ? Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 17:40 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Atum1 Код: java 1. 2. 3. Короче, всегда будет 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 17:45 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovP.S. Читал, что в плюсах простое появление try-блока автоматически создаёт постоянные накладные расходы. В ява, насколько я понимаю, основная доля этих расходов "перенесена" на сборку мусора. Соответственно, если уж мы миримся (готовы мириться) со сборкой мусора, то протестовать против исключений - глупо. Хорошо бы ссылку на источник. Т.к. хоть какие-то накладные расходы в любом случае будут - например будет длиннее байт код При чем сборщик мусора и try-catch, мне вообще не понятно. Выкидывание исключения, явно должно порождать некое торможение. Если какой нибудь цикл миллион раз, то плодить миллион исключений ради "ООПшности" так же глупо, как плодить миллион объектов за зря. И наличие/отсутствие сборщика мусора здесь совершенно не при чем. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 19:08 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
P.S. Сам заинтересовался. Слабал простенький тест на Integer.parseInt. Как не парадоксально (но объяснимо), скорость при наличие блока try..catch даже БЫСТРЕЕ, чем без оного ))) Код: Код: 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. Результат: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 19:23 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Atum1вот пример будет 4 http://ideone.com/kGRaiO как получить 3 ? По БЛ код в finally и exception должен быть разный. Т.е. не один return переменная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 20:11 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevКак не парадоксально ( но объяснимо ), скорость при наличие блока try..catch даже БЫСТРЕЕ, чем без оного ))) так объясните плиз ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 20:27 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevP.S. Сам заинтересовался. Слабал простенький тест на Integer.parseInt. Как не парадоксально (но объяснимо), скорость при наличие блока try..catch даже БЫСТРЕЕ, чем без оного ))) В 2016м году за тест без использования jmh надо сразу в junior-developer'ы переводить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2016, 21:06 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Petro123Atum1вот пример будет 4 http://ideone.com/kGRaiO как получить 3 ? По БЛ код в finally и exception должен быть разный. Т.е. не один return переменная. так и есть 3!=4 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 08:54 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, на моей железке с jMH Код: java 1. 2. 3. 4. 5. 6. Не уверен что точно описал параметры iterations, management, fork, и если кто имеет основания покорректировать - то пускай делает я не буду возражать. Код: 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. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 11:52 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Alexey TominВ 2016м году за тест без использования jmh надо сразу в junior-developer'ы переводить. Его можно как-то по человечески прицепить к JUnit тестам ? Сам jmh в доке видел, но ни разу не использовал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 11:57 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Насколько я понял его можно черег егойный API просто вызвать ну так-же как мы вызываем TestSuite. Код: java 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:00 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
To mayton Код: java 1. 2. 3. 4. 5. 6. Можно по русски. Сколько секунд/микросекунд выполнялась каждая процедура? Score это что такое? На секунды/микросекунды не похоже Отчего такая феерическая разница с "тупым" System.currentTimeMillis() ? Garbage Collector ? Может ли jmh выдавать параллельно статистику по потреблению памяти, т.к. чисто такты без учета замусоривания памяти вроде сильно ни о чем. Приведенный класс-бечмарк из Eclipse by default должен запускаться? Или в Eclipse что-то доставлять/добавлять нужно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:12 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsev, по идее ничего в эклипс не надо добавлять. Это просто maven проект. Болванку я создал так Код: java 1. 2. 3. 4. 5. 6. 7. Насчёт разницы сложно что-то сказать. 4 минуты это общее суммарное время работы теста куда вошли эти самые warmup (прогревы) и несколько циклов замеров. По поводу 0,458б, 0,376, 0,422 - да это похоже среднее число милисекунд на каждый метод. У меня ноутбук послабее поэтому цифры другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:42 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Ну и похоже я во втором тесте просто не тот абзац скопи-пастил. Лоханулся немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 12:45 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Вроде JMH умеет еще и память отслеживать через GC or HS_GC profiler. Будет время, поиграюсь Странная разница. По JMH получилось, что: 1) withoutErrors = 0,376 TryCatchBenchmark.withoutTryCatch = 0,422 Код без обработки ошибок в 0,422 / 0,376 = 1.122 раза МЕДЛЕННЕЕ, чем код с корректной обработкой ошибок. >10% это уже прилично. Через тупой System.getcurrenttimemillis у меня получилось самое большее 1.033 раза медленнее. Тенденция та же (медленнее), но разница почти на порядок меньше. Хотя, возможно, это зависит от версии Java и типа процессора. У меня java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode) AMD FX-4350 4.2 Gh 2) TryCatchBenchmark.withErrors avgt 15 0,458 ± 0,149 s/op TryCatchBenchmark.withoutErrors avgt 15 0,376 ± 0,088 s/op Код с генерацией ошибки работал в 0,458 / 0,376 = 1.21 раза медленнее, чем код, где все без ошибок. Через тупой System.getcurrenttimemillis 119 823 / 2 607 = 45 !!! раз медленнее. Понятно, что в данную цифру вошли так же затраты на Garbage Collector. Но вот вопрос можно ли "сборку мусора" игнорировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 13:12 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
grokLeonid KudryavtsevКак не парадоксально ( но объяснимо ), скорость при наличие блока try..catch даже БЫСТРЕЕ, чем без оного ))) так объясните плиз __предположений__ может быть как грязи. Обработку Exception все равно кому-то делать нужно. Или программисту явно в коде, или JVM. Возможно, что явная обработка обходится дешевле, чем универсальная Если проводить параллели с C-ными setjmp, longjmp. То неявная обработка - это всегда setjmp/longjmp. А если в коде есть явная обработка и JIT компилятор сделал inline для вызываемой ф-ции, то можно exception заменить на банальный goto. чисто предположение. Точно знают только авторы JVM и JIT-компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 13:18 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevКод с генерацией ошибки работал в 0,458 / 0,376 = 1.21 раза медленнее, чем код, где все без ошибок. Через тупой System.getcurrenttimemillis 119 823 / 2 607 = 45 !!! раз медленнее. Понятно, что в данную цифру вошли так же затраты на Garbage Collector. Но вот вопрос можно ли "сборку мусора" игнорировать. Дальше я пишу свое чортово ИМХО и могу быть с ним не согласен. Я умышленно уменьшил число форков и думаю зря. В эту формулу GC конечно тоже входил но его влияние нужно было распылить по максимуму. Например по 0.1% времени от usertime каждого метода. И думаю не зря там стояло по 10 раз "прогреть машину" и еще 10 раз замерять. Кроме того после у тебя все 3 теста шли в 1 методе. Тоесть JIT компиллятор все одним махом соберет после какого-то executions thresold, а в моем случае каждый тест в своём методе. Кроме того мы не смотрели байткод. А я думаю что это интересно. Что компиллятор оттуда выкинул что добавил. И еще одна ИМХА - в примерах по JMH я обнаружил интересную аннотацию @CompilerControl(CompilerControl.Mode.DONT_INLINE) Надо почитать как она работает. И помедитировать вообще над компиллятором. И еще одна ИМХА - надо почитать про оптимизацию генерации стека exception о которой говорил Блажкович. Возможно важно не количество исключений в цикле а их факт срабатывания хотя-бы 1 раз за цикл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 15:16 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevХорошо бы ссылку на источник. Т.к. хоть какие-то накладные расходы в любом случае будут - например будет длиннее байт код При чем сборщик мусора и try-catch, мне вообще не понятно.Касательно плюсов - только в бумажном виде (С.Мейерс, два издания "Эффективного C++"). Касательно явы ... Разница в том, что у плюсатых объектов есть деструкторы и компилятор обязан вызывать их когда объект покидает область видимости. Более того, на гарантии этого вызова строятся различные схемы освобождения ресурсов и это поведение никогда не изменится. Т.к. объекты C++ могут существовать на куче, в статической памяти и на стеке, то при раскручивании стека требуется уничтожить всё, что было создано непосильным трудом. Включая и сам объект-исключение, т.к. он тоже создавался на стеке. Но поскольку объект-исключение нужен - компилятор вынужден вставлять код копирования этого объекта. Хотя такое копирование можно оптимизировать в некоторых сценариях, скорости плюсатым исключениям всё это не добавляет. В ява объекты создаются исключительно на куче, деструкторы отсутствуют и компилятору достаточно "таскать" ссылку на объект. Накладные расходы, разумеется, будут, но много меньше.Если какой нибудь цикл миллион раз, то плодить миллион исключений ради "ООПшности"И вам повторю, что если в цикле есть try-блок, то это ещё не означает, что исключение будет возникать при каждой итерации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2016, 19:12 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Я к тому, что исключение это все таки механизм для обработки ошибочных ситуаций. Т.е. потенциально их не должно быть много. Часто же они начинают использоваться как некий признак при корректной работе. Например, предположим, что у нас есть последовательность слов и нам нужна проверка: число/не число. IMHO использовать исключения в данном случае, не очень хорошая идея. Вне зависимости от языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 15:18 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЯ к тому, что исключение это все таки механизм для обработки ошибочных ситуаций. Т.е. потенциально их не должно быть много. вроде это все знают. Кроме того, отладка не только в логах бывает. Неудобно отлаживать пошагово при исключениях)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 15:48 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevЯ к тому, что исключение это все таки механизм для обработки ошибочных ситуаций. Т.е. потенциально их не должно быть много.+1 я про это тоже говорил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 16:09 |
|
||
|
подскажите что почитать про исключения
|
|||
|---|---|---|---|
|
#18+
Leonid KudryavtsevНапример, предположим, что у нас есть последовательность слов и нам нужна проверка: число/не число. IMHO использовать исключения в данном случае, не очень хорошая идея. Вне зависимости от языка.Если проверка - да, исключение выглядит странно. Но где есть именно такой вариант? parseXXX() - не проверки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2016, 18:52 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2124257]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
57ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
80ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 388ms |

| 0 / 0 |
