powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Исключения
22 сообщений из 22, страница 1 из 1
Исключения
    #33632328
Возник спор о том, в каком случае следует наследовать исключения от RuntimeException, а в каком от Exception.

Хотелось бы услышать мнение знающего народа.
Спасибо.
...
Рейтинг: 0 / 0
Исключения
    #33632386
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крошкин
> Возник спор о том, в каком случае следует наследовать исключения
> от RuntimeException, а в каком от Exception.

> Хотелось бы услышать мнение знающего народа.
> Спасибо.Тема==Ответить




1ое можно не отлавливать, но тогда приложение перестанет работать в
случае исключения. рантайм - это критические исключения времени
выполнения, которые обычно трудно или невозможно предвидеть.
кстати, сервер приложений рантайм исключеия обрабатывает первым, при
этом он (на примере jboss) рвет транзакцию и удаляет бин из пула.

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Исключения
    #33632714
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крошкин ДимонВозник спор о том, в каком случае следует наследовать исключения от RuntimeException, а в каком от Exception.

Хотелось бы услышать мнение знающего народа.
Спасибо.


Мнений существует три (основных):

1. Сама идея exception'ов - идиотизм.

Программист обязан всё учесть!
Если он что-то не учёл, то программа обязана упасть в коре дамп.

2. Checked exceptions - идиотизм!

Все исключения должны быть unchecked и должны возникать в случае не обработанных явным образом "ситуаций" (т.к. эти ситации не описаны в T3 или программист дурак и просто их не учёл).

3. Checked exception - не идиотизм.

Вызов метода не обязательно закончится успешно для _любого_ входного набора данных/состояния объекта.

В некоторых случаях ограничения на данные могут быть проверены априори. Если ограничения не проверены и оказывается что метод не может завершится успешно - кидается рантайм эксепшин (синоним к "программист ты дурак").

Если проверка ограничений эквивалента по сложности/времени самому методу, либо не реализуема, то метод, в случае не возможности успешного завершения, кидает checked exception, объясняющий вызывающему, что не так с входными данными/состоянием объекта.

Исключение становится checked для того, чтобы программист не забыл его обработать, т.к. его возникновение это один из "обычных" сценариев выполнения кода.


Кроме того выделяют уровни "изоляции" для исключений.
1. Состояние объекта после исключения не известно какое
2. Состояние фиксированно
3. Состояние возвращено к исходному.

Кроме много есть анекдотов вокруг эксепшинов.
...
Рейтинг: 0 / 0
Исключения
    #33632856
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хороший пост. хотелось бы по подробнее про:
НасНипаиметьКроме много есть анекдотов вокруг эксепшинов.
...
Рейтинг: 0 / 0
Исключения
    #33633128
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exppхороший пост. хотелось бы по подробнее про:
НасНипаиметьКроме много есть анекдотов вокруг эксепшинов.

Я есть иметь следущий тема.

Эксепшины при всей своей "просте и очевидности" разными людьми оцениваются по разному.

Например, одни считают, что exception'ы делают code flow простым и понятным, другие - что запутывают и лишают возможности верификации.

Наследования и exception'ы (особенно checked) стыкуются слабо.

Принципы инкапсуляции могут быть легко нарушены при "тупом" пробрасывании эксепшинов вверх по стеку вызова или при их обработке.

Или зачем нужен эксепшин, если код возврата в ряде случаев ничем не хуже, а то и лучше?
...
Рейтинг: 0 / 0
Исключения
    #33633329
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Крошкин ДимонВозник спор о том, в каком случае следует наследовать исключения от RuntimeException, а в каком от Exception.

Хотелось бы услышать мнение знающего народа.
Спасибо.
Вообще никогда не наследовался от RuntimeException. Если объект обнаружил себя изувеченным после неправильного порядка вызова его методов, то кидаю IllegalStateException, если кто-то передает плохой аргумент, то кидаю IllegalArgumentException, если передаю кому-то враппер, в котором имплементированы не все операции, но они не должны вызываться никогда, а их имплементация - трудоёмка, кидаю UnsupportedOperationException. Если получаю Checked экзепшен, но обрабатывать его нет желания и нужды (все равно что-то не так c конфигурацией/окружающими факторами и программа дальше работать не будет в любом случае), то конвертирую его прямо в RuntimeException
Код: Java
1.
2.
3.
4.
5.
try {
  ...
} catch (SomeDB_orIO_orNetworkingError e)  {
  throw new RuntimeException(e);
}

В серверном коде checked исключения выглядят нормально. Получили исключение - откатились на всех уровнях, вернули клиенту ошибку. Проигнорировать его никто не имеет права, а если кто-то гасит исключения без логирования, то авторство кода обнаружить просто с помощью контроля версий.
В GUI выполнение асинхронное однопоточное, кроме того мы никогда не находимся контексте обработки какого-либо конкретного запроса. Так что в GUI можно вообще всегда кидать Unchecked, а где-то в одном месте их всех гасить и логировать. Через полгода посмотреть логи и обнаружить, что где-то возникает IndexOutOfBoundsException раз месяц, исследовать проблему и починить.
...
Рейтинг: 0 / 0
Исключения
    #33633443
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Ильич
Если получаю Checked экзепшен, но обрабатывать его нет желания и нужды (все равно что-то не так c конфигурацией/окружающими факторами и программа дальше работать не будет в любом случае), то конвертирую его прямо в RuntimeException

А желания того, кто будет вызывать код, который так будет делать, учитываются?


Сергей Ильич
В серверном коде checked исключения выглядят нормально. Получили исключение - откатились на всех уровнях, вернули клиенту ошибку.

А почему в GUI клиент не должен знать об ошибке?

Сергей Ильич
Так что в GUI можно вообще всегда кидать Unchecked, а где-то в одном месте их всех гасить и логировать.

После этого Softwarer ругается, что java gui кидают что-то в консоль и пользователь никогда не знает, сделала прорамма то, о чём её просили или нет :)
...
Рейтинг: 0 / 0
Исключения
    #33633583
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs Сергей Ильич
Если получаю Checked экзепшен, но обрабатывать его нет желания и нужды (все равно что-то не так c конфигурацией/окружающими факторами и программа дальше работать не будет в любом случае), то конвертирую его прямо в RuntimeException

А желания того, кто будет вызывать код, который так будет делать, учитываются?

Я так делаю в коде верхнего уровня, который имеет право решать - работать ему дальше или нет. В библиотеках так делать, конечно, нельзя. А Джошуа Блох вообще говорит - если клиенту кода ничего не останется сделать кроме как написать
Код: plaintext
1.
2.
3.
4.
5.
6.
 try {
...
}  catch  (SomeException e) {
e.printStackTrace();
System.exit( 1 );
}
то возбуждать RuntimeException.
NotGonnaGetUs
Сергей Ильич
В серверном коде checked исключения выглядят нормально. Получили исключение - откатились на всех уровнях, вернули клиенту ошибку.
А почему в GUI клиент не должен знать об ошибке?

Ну почему - должен. Где-то на верхнем уровне отловили и показали панельку. В GUI мы выполняемся асинхронно, поэтому в каком контексте произошла ошибка как правило непонятно. Вообще, GUI код меня раньше коробил. Все операции идут на Object - Type safety идет лесом. Экзепшены тоже не пробрасываются. Однако потом я понял, что ничего лучше наверно нету. В С++ я тоже в ядре делаю все аккуратненько, но в GUI тоже не утруждаю себя думать над тем, что произойдет в случае экзепшена в обработчике мыши или ресайза окна.
NotGonnaGetUs
Сергей Ильич
Так что в GUI можно вообще всегда кидать Unchecked, а где-то в одном месте их всех гасить и логировать.
После этого Softwarer ругается, что java gui кидают что-то в консоль и пользователь никогда не знает, сделала прорамма то, о чём её просили или нет :)
Ну, не на консоль, а в логгер. А во вторых - задолбаешься писать обработчики полета НЛО после дождика в четверг. Фасад доступа к визуализируемым в GUI данным должен работать надежно, вот что.
...
Рейтинг: 0 / 0
Исключения
    #33633780
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsНаследования и exception'ы (особенно checked) стыкуются слабо.
Ну или возвращаемся к некрасивой идее "почти каждый метод описан как throws Exception".

NotGonnaGetUsПринципы инкапсуляции могут быть легко нарушены при "тупом" пробрасывании эксепшинов вверх по стеку вызова или при их обработке.
Пожалуй что не уловил глубины мысли.

NotGonnaGetUsИли зачем нужен эксепшин, если код возврата в ряде случаев ничем не хуже, а то и лучше?
Для остальных, куда более частых случаев.
...
Рейтинг: 0 / 0
Исключения
    #33633789
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ИльичЕсли объект обнаружил себя изувеченным после неправильного порядка вызова его методов
То лично я бы вправил мозги программисту, проектировавшему и/или реализовывашему этот объект.

У объекта есть (может быть) состояние. Методы могут менять состояние. Если метод не в состоянии корректно изменить состояние, он должен оставить объект в исходном состоянии и выбросить исключение. Изувеченное состояние на входе означает, что некий метод "отработал нормально" и при этом оставил после себя изувеченный объект. То есть если переводить на аналогии с БД - разрушил целостность и выполнил commit.

Сергей Ильичлогировать. Через полгода посмотреть логи и обнаружить, что где-то возникает IndexOutOfBoundsException раз месяц, исследовать проблему и починить.
И пока не починили - полгода держать программистов без премий. За высокий профессионализм, выражающийся в любимой пользователями ситуации "нажимаю кнопку - и ничего не происходит. Даже сообщения об ошибке не пишет, зараза".
...
Рейтинг: 0 / 0
Исключения
    #33633841
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Сергей ИльичЕсли объект обнаружил себя изувеченным после неправильного порядка вызова его методов
То лично я бы вправил мозги программисту, проектировавшему и/или реализовывашему этот объект.

У объекта есть (может быть) состояние. Методы могут менять состояние. Если метод не в состоянии корректно изменить состояние, он должен оставить объект в исходном состоянии и выбросить исключение. Изувеченное состояние на входе означает, что некий метод "отработал нормально" и при этом оставил после себя изувеченный объект. То есть если переводить на аналогии с БД - разрушил целостность и выполнил commit.

По философии зачот. Не всегда внешний интерфейс в который надо завраппить свой код это позволяет.
softwarer
Сергей Ильичлогировать. Через полгода посмотреть логи и обнаружить, что где-то возникает IndexOutOfBoundsException раз месяц, исследовать проблему и починить.
И пока не починили - полгода держать программистов без премий. За высокий профессионализм, выражающийся в любимой пользователями ситуации "нажимаю кнопку - и ничего не происходит. Даже сообщения об ошибке не пишет, зараза".
Операции типа запросов к БД в контексте обработчика кнопки делают только индусы. Делать это надо в воркер-треде за мостом, который связывает синхронное многопоточное ядро с асинхронным event-driven GUI. Завести какой-нибудь Action, который диалоговую панель синформацией об ошибке
выводит, и в обработчике ошибок в фасаде к БД активизировать этот Action. Смысла пробрасывать исключения до уровня хэндлеров кнопок лично я не вижу.
...
Рейтинг: 0 / 0
Исключения
    #33636257
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer
NotGonnaGetUsПринципы инкапсуляции могут быть легко нарушены при "тупом" пробрасывании эксепшинов вверх по стеку вызова или при их обработке.
Пожалуй что не уловил глубины мысли.


На пальцах:

Есть интерфейс ХХХ с методом ххх().

В реализации А оказалось, что нужно кинуть эксепшин.
Поправили: xxx() throws E_A;

В реализации B оказалось, что нужно кинуть эксепшин тоже, но другой.
Поправили: xxx() throws E_A, E_B;

Решили написать класс С пользующийся услугами ХХХ: если начнём пытаться обрабатывать ошибки получим зависимость от реализации интерфейса.

Заменив xxx() throws E_A, E_B; на xxx() throws Exception; - лишились бы перимуществ статической типизации и всё равно не избавились бы от необходимости хардкодить зависимости от реализаций...

Данный пример не обзязательно следствие "плохого" проектирования ХХХ.
Н-р, такой кракозябл мог возникнуть в следствии изменения требований.

-
Offtopic:

Данный пример не иллюстрация того, что checked exception'ы - идиотизм.

Вместо 'throw Exception' или 'E_A, E_B' должен был быть выделен обобощённый E_XXX, с необходимыми для обработчика методами доступа.

Чтобы получать выгоды от использования exception'ов нужно тратить какое время на их проектирование (какие, когда, кто и как будет обрабатывать и т.п.).
...
Рейтинг: 0 / 0
Исключения
    #33636426
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ИльичПо философии зачот. Не всегда внешний интерфейс в который надо завраппить свой код это позволяет.
Что именно - корректно изменить состояние? Сомневаюсь, признаться. Пожалуй даже готов дать математически строгое доказательство того, что любой объект, для которого существует "правильная" последовательность вызовов, может быть изменен так, чтобы корректно работать с "неправильной".

Сергей ИльичОперации типа запросов к БД в контексте обработчика кнопки делают только индусы.
Итак, Вы откуда-то придумали "операции типа запросов к БД в контексте обработчика" и дальше начали развивать теорию, не имеющую отношения к сказанному мной. Итого - демагогия.

Сергей ИльичСмысла пробрасывать исключения до уровня хэндлеров кнопок лично я не вижу.
А кто говорит о пробрасывании? Они там иногда случаются. Хотя бы те самые, которые Вы собираетесь выуживать из логов.
...
Рейтинг: 0 / 0
Исключения
    #33636436
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Я таки не понял, при чем тут нарушение принципов инкапсуляции в контексте именно "пробрасывания по стеку". Если говорить о "знании деталей чужой реализации", выражающейся в указании "чужих exception-ов", то эта проблема равно характерна для любого класса, где родительский метод вынужден описывать в себе throws, нафиг ему не нужные, но нужные в одном из дочерних классов. То есть это в чистом виде сказанное Вами в предыдущей фразе "наследование и checked exceptions плохо стыкуются". Что же до unchecked exceptions, то с ними я не вижу никаких проблем ни в наследовании, ни в приведенном Вами примере.

В целом по сказанному примеру - можно развернуть большое обсуждение, но если честно, сейчас оно мне несколько неинтересно. Если говорить о предлагаемом Вами варианте, идеальным выходом была бы возможность прописывать в throws интерфейсы к exception-ам (честно говоря, не пробовал, так что не знаю, возможно такое или нет).
...
Рейтинг: 0 / 0
Исключения
    #33636452
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Сергей ИльичПо философии зачот. Не всегда внешний интерфейс в который надо завраппить свой код это позволяет.
Что именно - корректно изменить состояние? Сомневаюсь, признаться. Пожалуй даже готов дать математически строгое доказательство того, что любой объект, для которого существует "правильная" последовательность вызовов, может быть изменен так, чтобы корректно работать с "неправильной".

Если последовательность вызовов неверная, генерирую IllegalStateException. Вопрос закрыт.
softwarer
Сергей ИльичОперации типа запросов к БД в контексте обработчика кнопки делают только индусы.
Итак, Вы откуда-то придумали "операции типа запросов к БД в контексте обработчика" и дальше начали развивать теорию, не имеющую отношения к сказанному мной. Итого - демагогия.

Демагогия у вас, поскольку Вы выносите дискуссию о каких-то математических понятиях и абстрактных концепциях. Речь идет о GUI, стало быть речь о том что делать в исключениеми, возникшими внутри ActionListener.actionPerformed() или MouseMotionListener.mouseMoved(). По какой причине они могут там возникнуть? Что прикажите с ними делать? Нахрена они там нужны? Как по Вашему в Идеальном языке с ними можно поступить? В C просто игнорируют коды возврата. В Java просто давят исключения и все: контекст возникновения как правило давно утерян, обработка событий должна быть короткой - тред у свинга один, и способа передать контекст ошибки в следуший хандлер нет.
...
Рейтинг: 0 / 0
Исключения
    #33637191
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer Если говорить о "знании деталей чужой реализации", выражающейся в указании "чужих exception-ов", то эта проблема равно характерна для любого класса, где родительский метод вынужден описывать в себе throws, нафиг ему не нужные, но нужные в одном из дочерних классов.

Эта проблема и есть нарушение инкапсуляции - т.е. выставление на ружу деталей реализации.


То есть это в чистом виде сказанное Вами в предыдущей фразе "наследование и checked exceptions плохо стыкуются".

Наследование не единственная форма взаимного использования классами друг друга. Взгляните на любой шаблон проектирования и прикинте как там будут летать эксепшины...


Что же до unchecked exceptions, то с ними я не вижу никаких проблем ни в наследовании, ни в приведенном Вами примере.

А они есть (с)анекдот.

Если использовать в данной ситуации unchecked exceptions придётся либо
а) знать детали каждой из реализаций используемого интерфейса (причём даже тех, что ещё не появились)
либо б) использовать exception только как флаг _произошла ошибка_ без какой-либо дополнительной информации позволяющей по разному обрабатывать разные ситуации.

Сhecked exception избавляют от необходимости знать то, что знать не возможно (например будущего).
Массовое же использование unchecked exceptions приводит к ситуации, которую вы описали словами "ставить трай-катч вокруг любого вызова библиотечного метода".

-

Чтобы далеко не уходить от реальности, нужно отметить, что то, как использовать exception'ы, зависит от требований к разрабатываемому продукту.

В программах, где ошибки не ведут к фатальным последствиям, вполне допустимо использовать подход "обработка ошибки по факту":
не писать код обрабатывающий ошибку, до тех пор пока она реально не возникла при тестировании или работе приложения.
Надёжным такой код не назовёшь, но зато экономится время.
При таком подходе checked exceptions только замедляют работу и вводят трудно уловимые ошибки связанные с сокрытием ошибок (пустой catch(){}).

Если же на передний план выходит вопрос надёжности, то время потраченное включение в проектное решение исключительных ситуаций себя вполне окупает.


Если говорить о предлагаемом Вами варианте, идеальным выходом была бы возможность прописывать в throws интерфейсы к exception-ам (честно говоря, не пробовал, так что не знаю, возможно такое или нет).

Никто не запрещает наследование exception'ов, что в сущности эквивалентно использовнию интерфейсов (заисключением множественного наследования). Достаточно распространён приём связанный с созданием "конвертеров" преобразующих эксепшины конкретных реализаций к задекларированному в интерфейсе виду.


В целом по сказанному примеру - можно развернуть большое обсуждение, но если честно, сейчас оно мне несколько неинтересно.

+, зачем лишний раз сотрясать клавиатуру бодрым выстукиваем умных слов? Думаю пищи для ума Крошкин Димон и так уже получил достаточно :)
...
Рейтинг: 0 / 0
Исключения
    #33638538
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А они есть (с)анекдот.
Не верю (с) Станиславский.

Если использовать в данной ситуации unchecked exceptions придётся либо
а) знать детали каждой из реализаций используемого интерфейса (причём даже тех, что ещё не появились)
либо б) использовать exception только как флаг _произошла ошибка_ без какой-либо дополнительной информации позволяющей по разному обрабатывать разные ситуации.
Либо же в) писать обработку каждого исключения в подходящем месте. Там, где нужно обработать конкретное исключение - обрабатывать его. Остальные пускать дальше, возможно обработав по некоторой общей схеме, и знать, что другие, неизвестные части программы, обработают их так, как сочтут нужным.

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

Код: plaintext
1.
2.
3.
Ошибка при сохранении файла конфигурации: 
Файл не может быть открыт, так как заблокирован другим приложением.

Файл: c:\app\app.cfg

Здесь основной является вторая строка - это собственно говоря текст, сгенерированный в месте исключения, методе например FileWriter.Open, а первая и третья строки - добавлены методами, допустим Application.SaveCfgFile и FileWriter.Write соответственно (cтек вызова в этом примере - SaveCfgFile -> Write -> Open).

Сhecked exception избавляют от необходимости знать то, что знать не возможно (например будущего).
В свете названной Вами проблемы - сомнительное утверждение. Строго наоборот: они требуют знания будущего, поскольку вынуждают в момент проектирования класса указать знания, относящиеся к деталям реализации возможных потомков. Указанный же Вами вариант сокрытия информации об изначальном исключении имеет свои минусы, поскольку крайне осложняет централизованную обработку ошибок.

Массовое же использование unchecked exceptions приводит к ситуации, которую вы описали словами "ставить трай-катч вокруг любого вызова библиотечного метода".
Я не припомню у себя таких слов, как минимум сказанных в этой теме. Мало того, я категорически не согласен с этим утверждением. Если Вы покажете мне, какую цитату имеете в виду - уверен, все окажется не так просто.

Если мне не изменяет память, в какой-то момент я говорил Вам, что концепция исключений в Яве в текущей реализации вместо помощи программисту мешает ему, поскольку даже если метод декларируется как не выкидывающий исключений, тем не менее он может выкинуть исключение и эту возможность надо предусмотреть. При этом сколь помню я показывал, что в JDK нет единой логики выкидывания исключений, что также усложняет жизнь. Возможно, Вы имели в виду именно эти слова - но тогда не надо приводить аргумент против checked exceptions как аргумент против unchecked exceptions.

В программах, где ошибки не ведут к фатальным последствиям, вполне допустимо использовать подход "обработка ошибки по факту":
не писать код обрабатывающий ошибку, до тех пор пока она реально не возникла при тестировании или работе приложения.
Хм. Скажем так, я абсолютно уверен, что написание может оказаться оправданным только при разовой внутренней автоматизации, разовом решении какой-либо задачи. Полагаю, обсуждение этой темы окажется большим и изрядно бесполезным, поэтому предлагаю зафиксировать расхождение точек зрения и не углубляться.

При таком подходе checked exceptions только замедляют работу и вводят трудно уловимые ошибки связанные с сокрытием ошибок (пустой catch(){}).

Если же на передний план выходит вопрос надёжности, то время потраченное включение в проектное решение исключительных ситуаций себя вполне окупает.
Скажем так, я не ощутил, чем checked exceptions помогают надежности. Поработав в дельфе, где говоря джавовским языком, все exceptions unchecked, поработав на яве (и надеюсь, попрощавшись с ней), я не ощутил преимуществ checked exceptions, но сполна ощутил их неудобства. Прошу отметить, что в обоих случаях я работал над кодом повышенной ответственности (24x7 сервис в первом случае и ядро крупного сложного приложения во втором).

Никто не запрещает наследование exception'ов, что в сущности эквивалентно использовнию интерфейсов (заисключением множественного наследования).
В данном случае нужно именно множественное наследование, и в яве его единственным суррогатом являются интерфейсы. Давайте смотреть.

Допустим, у нас есть интерфейс IDataExchange и его реализации FileExchange, EMailExchange итп. Реализации склонны выбрасывать из себя соответственно FileException, EMailException итп. Вы хотите, чтобы из IDataExchange наружу шел некий универсальный класс исключения, то, что можно обработать без углубления в специфику класса исключения, некий DataExchangeException.

Наиболее идеологичное, что можно сделать в Яве для решения такой ситуации (в общем случае) - описать DataExchangeException как интерфейс; в реализациях описать соответственно наследников XXXXException, реализующих DataExchangeException, и возбуждать именно их. Правда, тут еще вылезет проблема, связанная с невозможностью реализовать helper, расширение, если исключение не возбуждается собственно реализацией, а получается ей из используемой библиотеки.

Это лучшее, что можно было бы сделать, но такого вроде как не удастся :(

Достаточно распространён приём связанный с созданием "конвертеров" преобразующих эксепшины конкретных реализаций к задекларированному в интерфейсе виду.
За неимением лучшего. Но это плохое решение, поскольку опять же идет нарушение инкапсуляции. Объясню, какое именно.

Допустим, у нас есть цепочка использования: A -> B -> C. Объект C возбуждает некоторое исключение; класс A содержит его обработку. Если в классе B мы используем некий конвертер, мы тем самым должны в классе B знать, какая информация потребуется классу А, в то время как по идее, следовало бы просто передать транзитом любой объект и не думать о чужих проблемах. Последствия понятны: изменения в реализации А могут потребовать изменений в реализации конвертора, то есть в B.
...
Рейтинг: 0 / 0
Исключения
    #33638660
NotGonnaGetUs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerЛибо же в) писать обработку каждого исключения в подходящем месте.
Этот пунт мимо кассы.
Предпослыка состояла в том, что два исключения декларируются в одном методе. Если бы обработка делалась в "подходящем" месте, то необходимости в такой декларации не возникло бы.


Исключение поднимается выше по стеку, дефолтовая обработка заключается в дополнении к исключению информации об условиях его возникновения

Это пункт б) из поста выше.
Таким образом можно довести до _человека_ информацию о том, что пошло не так.
Если мы захотим восстанавливаться _автоматически_, нужно обладать возможностью анализа "дополнительной информации".
Никто не запрещает этого делать на основе анализа информации переданной в мессадже, но при этом мы теряем прелести статической типизации, а именно контроль в компил-тайм: допустим текст в мессадже изменился - придётся искать и исправлять все места, где он мог обрабатываться.
Если это не коробит - то пожалуйста, иначе - чекед эксепшины решают эту проблему.


(cтек вызова в этом примере - SaveCfgFile -> Write -> Open).

Вы имели ввиду SaveCfgFile -> Open -> Write ?


Строго наоборот: они требуют знания будущего, поскольку вынуждают в момент проектирования класса указать знания, относящиеся к деталям реализации возможных потомков.

Отнюдь.
Checked exception'ы служат для формализации требований к наследникам.
Если наследник не выполняет контракт родителя - то это не наследник.

Т.о. исключениям нужно знать о будущем нужно ровно столько же сколько классу "родителю".
Очевидно, что в этой ситуации проблема не в том, что исключения "плохие", а в том, что наследование сложная штука.



Указанный же Вами вариант сокрытия информации об изначальном исключении имеет свои минусы, поскольку крайне осложняет централизованную обработку ошибок.

Централизация предполагает, что есть "центр", который всё о всех знает.
Инкапсуляция приводит к децентрализации, тем самым позволяя избегать лавинообразных изменений в коде. Я предпочитаю второй вариант.

К тому же для простого ведения логов сокрытие информации о точном классе исключения не является проблемой.


Я не припомню у себя таких слов, как минимум сказанных в этой теме.
...
Если мне не изменяет память, в какой-то момент я говорил Вам, что ...

Так и было. Вам почему-то кажется, что только в java JDK и просто коде на java unchecked'ы летают куда попало без единой здравой мысли.

Нельзя в _приципе_ гарантировать "единственность логики" выкидывания unchecked exception'ов. Лучшее чего можно добиться (причём далеко не средствами языка) - это следования одному и тому же приципу в конкретном проекте.

Checked exception'ы позволяют упростить процесс фиксации "логики",
хотя здарвого рулевого во главе проекта они, конечно же, не заменят.


В ваши интимные отношения с JDK вступать не хочу :)



Скажем так, я не ощутил, чем checked exceptions помогают надежности. Поработав в дельфе, где говоря джавовским языком, все exceptions unchecked, поработав на яве (и надеюсь, попрощавшись с ней), я не ощутил преимуществ checked exceptions, но сполна ощутил их неудобства. Прошу отметить, что в обоих случаях я работал над кодом повышенной ответственности (24x7 сервис в первом случае и ядро крупного сложного приложения во втором).


Любое использование checked exception'ы может быть повторено при помощи unchecked exception'ов.

Разница только в одном: сhecked'ы дают дополнительную информацию компилятору, которая позволяет последнему помочь при валидации кода.

Например, объявив после реализации нового требования в каком-то методе новый эксепшин, можно достаточно быстро обнаружить места, которые потребуют синхоронного изменения.

Что лучше динамическая типизация или статическая? Что лучше unchecked или checked exceptions? - это одинаковые вопросы.

Я предпочитаю статическую типазацию. Я пишу код так, что бы компилятор как можно больше за меня проверял, т.к. я ленивый и всегда рад, если кто-то сделают мою работу за меня. Отход от статической типизации должен быть оправдан.

Спорить, что моё предпочтение лучше вашего (в случае exception'ов) я просто не хочу, т.к. плюсы и минусы есть у обоих решений, но их значимость существенно ниже, чем у самой идеи исключений.


skipped

Отсутствие множественного наследование всё такие проблема не исключений, а java. Да и само множественное наследование одна большая проблема %)


Конвертер (класс B) часть решения С. Об А он знает ровно столько, сколько должна знать реализация об интерфесе который она реализует...


Прошу прощения, тороплюсь домой.
...
Рейтинг: 0 / 0
Исключения
    #33644789
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUsИсключение становится checked для того, чтобы программист не забыл его обработать, т.к. его возникновение это один из "обычных" сценариев выполнения кода.


Исключение - один из обычных сценариев выполнения кода ? Даааа. Сильно!!
Наверное я что-то в этой жизни не понимаю...

NotGonnaGetUs
Кроме много есть анекдотов вокруг эксепшинов.

Где ? Давай !!
...
Рейтинг: 0 / 0
Исключения
    #33644798
ф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ф
Гость
MasterZivИсключение - один из обычных сценариев выполнения кода ? Даааа. Сильно!!
Наверное я что-то в этой жизни не понимаю...это наверняка
чего кипятишься? не понимаешь - прими как данность
...
Рейтинг: 0 / 0
Исключения
    #33644915
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NotGonnaGetUs
Данный пример не иллюстрация того, что checked exception'ы - идиотизм.


Боюсь, что именно так.

NotGonnaGetUs
Вместо 'throw Exception' или 'E_A, E_B' должен был быть выделен обобощённый E_XXX, с необходимыми для обработчика методами доступа.

Чтобы получать выгоды от использования exception'ов нужно тратить какое время на их проектирование (какие, когда, кто и как будет обрабатывать и т.п.).


Да, да. Только возникает вопрос - нафига ? Нафига мне тратить время на анализ каких-то часных случаев, когда я проектирую интерфейс (да я и даже знать не могу, что там за эксепшены будут в реализации). Потом, если и выделить N базовых классов случаев реальных исключений, которые могут возникнуть (это же подразумевалось под "тратить какое-то время на их проектирование"), то это во-первых, опять-таки - проблемы реализации, во-вторых, в реализации больше проблем - надо перехватить какие-то непредусмотренные исключения (NullPointerException например) и , обработав их, выкинуть предусмотренные. Тоже бред IMHO. Ну может не бред, но близко к тому...
...
Рейтинг: 0 / 0
Исключения
    #33650713
expp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но я тут читал, кой-чо и увидел:
Complete Java 2 Certification Study Guide Fifth Edition - page 165It is never appropriate for application programmers to construct and throw errors.

тема раскрыта ?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Исключения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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