Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Когда использовать исключения? 
:(
    Опции темы
Royan
  Дата 23.8.2007, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Вот такой, весьма простой с одной стороны вопрос, задал я себе недавно. Я над ним поразмышлял и придумал несколько аргументов как за так и против, пока я их говорить не стану, чтобы не сбивать вас с толку. Замечу лишь, что при ответе примете во внимание возможность сообщать об ошибках, например, через логгирование и визуальное оповещение. Так вот когда следует и когда не следует сообщать об ошибках выбрасывая исключение?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
w1nd
Дата 24.8.2007, 00:01 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



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



--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
nornad
Дата 24.8.2007, 03:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



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


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
y3u
Дата 24.8.2007, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



Цитата(w1nd @  24.8.2007,  01:01 Найти цитируемый пост)
Всегда, когда в данном методе невозможно обработать ошибку, при этом дальнейшее выполнение невозможно.


ёмко... +1


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
Den1s
Дата 24.8.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 27.10.2005

Репутация: нет
Всего: нет



Цитата(Royan @ 23.8.2007,  18:13)
Вот такой, весьма простой с одной стороны вопрос, задал я себе недавно. Я над ним поразмышлял и придумал несколько аргументов как за так и против, пока я их говорить не стану, чтобы не сбивать вас с толку. Замечу лишь, что при ответе примете во внимание возможность сообщать об ошибках, например, через логгирование и визуальное оповещение. Так вот когда следует и когда не следует сообщать об ошибках выбрасывая исключение?

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

Это сообщение отредактировал(а) Den1s - 24.8.2007, 08:34
PM MAIL   Вверх
_Y_
Дата 24.8.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Замечание основанное на чистой "психологии". Если прога будет использоваться юзерами, то она должна ругаться исключениями только в случае нештатных ситуаций. Типа такого:
  • Все почти в порядке - JOptionPane.INFORMATION_MESSAGE
  • Нехорошо, но поправимо - JOptionPane.WARNING_MESSAGE
  • Непоправимо, но ошибка частая и причина ее скорее юзер - JOptionPane.ERROR_MESSAGE
  • Что-то совсем дурное - остановка программы по исключению.


Это сообщение отредактировал(а) _Y_ - 24.8.2007, 09:32


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
w1nd
Дата 24.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(_Y_ @  24.8.2007,  09:29 Найти цитируемый пост)
Если прога будет использоваться юзерами, то она должна ругаться исключениями только в случае нештатных ситуаций.

Если прога будет использоваться юзерами, то ВСЕ исключения должны обрабатываться, результатом чего и должны быть окошки с сообщениями об ошибке.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
le_chat
Дата 24.8.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 26.10.2006

Репутация: нет
Всего: нет




сам недавно задавался подобным вопросом. пришел к выводу что исключения есть сигнал программисту об ошибке в логике программы.
пользователь конечно никаких исключений видеть не должен. только вот это не всегда удобный сигнал - в j2me к примеру при отладке на девайсе при бросании исключения поток скорее всего просто повиснет без всяких сообщений, а некоторые девайсы вообще скушают исключения и не подавятся.
PM MAIL   Вверх
_Y_
Дата 24.8.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(w1nd @ 24.8.2007,  10:45)
Если прога будет использоваться юзерами, то ВСЕ исключения должны обрабатываться, результатом чего и должны быть окошки с сообщениями об ошибке.

Это идеальный вариант. К сожалению, не помню названия книги, в которой доволно детально была описана проблема. Сколь помню идея такова:
Цитата

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



--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Sartorius
Дата 24.8.2007, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: нет
Всего: 37



Цитата

К сожалению, не помню названия книги, в которой доволно детально была описана проблема

 У Макконела в "Совершенном коде" довольно неплохо тема раскрыта
PM MAIL ICQ   Вверх
Royan
  Дата 24.8.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Хорошо задаю наводящий вопрос в форме жизненной задачи.
Например, вы написали свой класс унаследованный от TabbedPaneUI, который в заисиовсти от текущего L&F работает по разному. Теперь перед вами стоит вопрос как поступить, если установленный пользователе L&F отличается от тех, что вы обрабатываете в своем TabbedPaneUI? Как бы поступили вы? При ответе примите во внимание, что в вашем проекте может быть множество классов, которые переписывают интерфесы разных GUI компонент.


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
y3u
Дата 24.8.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



Цитата(Royan @  24.8.2007,  15:59 Найти цитируемый пост)
Как бы поступили вы?


точка входа есть? Как только определили, что гуй не отрисуется по такому ЛАФ, то сообщаем об этом юзверю алертом, а сами подтыкиваем какой-нибудь дефолтный ЛАФ, чтобы гуй, таки, запустился... 

Это сообщение отредактировал(а) y3u - 24.8.2007, 15:44


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
hydrant
Дата 24.8.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 10.8.2007

Репутация: нет
Всего: нет



А как насчёт Double.parseDouble(java.lang.String stringToParse)?
Я всегда использую такую конструкцию:
Код

        double value = 0;
        boolean wasValueParsed=true;
        String possibleNumericvalue="122.0";
        try{
            value=Double.parseDouble(possibleNumericvalue);
        } catch (NumberFormatException e){
            wasValueParsed=true;
        }
        System.out.print("Numeric value \""+possibleNumericvalue+"\" ");
        if (wasValueParsed){
            System.out.println("has been parsed as double value "+value);
        } else {
            System.out.println("can not be parsed as double value");
        }


Я что-то в корне неправильное делаю или это типичный случай использования исключений, когда они не являются некими "страшными исключения", а просто средством для принятия дальнейшего решения?

Добавлено через 14 минут и 21 секунду
Упс, я извиняюсь.
Кажется я не совсем правильно понял суть изначального вопроса.
PM MAIL   Вверх
w1nd
Дата 24.8.2007, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



Цитата(_Y_ @  24.8.2007,  11:51 Найти цитируемый пост)
Предусмотреть все возможные ситуации в достаточно сложном софте невозможно.

Цитата(Royan @  24.8.2007,  14:59 Найти цитируемый пост)
 Теперь перед вами стоит вопрос как поступить, если установленный пользователе L&F отличается от тех, что вы обрабатываете в своем TabbedPaneUI?

Все _ситуации_ предусмотреть невозможно. Всё возможные _исключения_ обработать не только можно, но и довольно легко, тем более в java.




--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
y3u
Дата 24.8.2007, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 440
Регистрация: 9.9.2006
Где: Москва

Репутация: 5
Всего: 13



надо место в коде использовать эргономично... 

Код

    double value = 0;
    String possibleNumericvalue="122.0";
    try{
         value = Double.parseDouble(possibleNumericvalue);
         System.out.println("has been parsed as double value "+value);
    } catch (NumberFormatException e) {
         System.out.println("can not be parsed as double value");
         // раз уж мы отловили тут исключение, то крайне не этично тут делать rethrow этого же NumberFormatException
         // либо мы убираем отсюда блок try/catch и добавляем в метод throws NumberFormatException
         // тогда мы вылетим на этом месте из метода
         // либо мы тут оставляем все как есть, но выполняем какую-то бизнес-логику, которая позволит нам дальше по ходу
         // использовать value в штатном режиме
    }
}


я так мыслю, если бы мы открывали какие-либо потоки, которые могут нам бросить какой-нить эксцебшон, то вполне уместно обернуть их try/catch и finally, в последнем мы все открытое должны прибить, апосля можно бросать какой-нибудь эксцебшон, желательно своего собственного типа, а как его там навихру у Карлсона будут или не будут отбрабатывать - не наша забота...

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


--------------------
В нашей стране настаивать на кореньях, черной смородине, лимонных корках - гораздо эффективнее, чем на правах
PM MAIL   Вверх
_Y_
Дата 25.8.2007, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Цитата(w1nd @ 24.8.2007,  23:42)
Все _ситуации_ предусмотреть невозможно. Всё возможные _исключения_ обработать не только можно, но и довольно легко, тем более в java.

1. Вроде бы тема использавать-не использовать исключения, а не обрабатывать-не обрабатывать smile Но это, конечно, софистика и придирки smile 

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

y3u, я с Вами совершенно согласен. Сам сталкивался со случаями, когда обработка исключения вместо отслеживания причины помогает сэкономить уйму кода и производительности.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
Royan
  Дата 25.8.2007, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Dreamer
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 14.9.2002
Где: Лондон

Репутация: 3
Всего: 15



Постулирую:
Конечный пользователь, пользующийся production app не должен знать ни о каких исключениях с этим вроде бы все согласны
Среда обязана работать и выполнять свои функции до тех пор пока она их выполнять не сможет
В случае ошибки внутри приложения она должна оставить какой-то след, чтобы потом разработчик смог разобрать откуда растут ногу у возникшей проблемы
 
Проблема номер 1 Я не случайно привел пример с L&F. Дело в том, что если какая-то кнопка не может отрисоваться, используя какой-либо L&F она обязана отрисовываться хоть как то.
Проблема номер 2 Взгляните на этот вопрос с точки зрения дизайнера или архитектора. 

1) Почему какая то кнопка должна завязываться на какой-то Exception? 
2) Если ответ на вопрос номер 1 положительный, то на какой именно Exception? 
3) Что если вы не можете переписать сигнатуру метода для того чтобы он выбрасывал UnsupportedLookandFeelException или какой-либо другой? 
4) Должен ли в таком случае класс "кнопки!!" узнать о каком-то логгере? 

Как бы вы ответили на эти вопросы?


--------------------
Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь
PM MAIL MSN   Вверх
w1nd
Дата 25.8.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



1. Если неэк переписать сигнатуру, выбрасывается RuntimeException.
2. В java с версии 1.5 можно ловить необработанные исключения. На поток устанавливается обработчик.
3. ВСЕ классы могут/должны знать о логгере.
4. Рассчитывать на определённый LnF нельзя, пишите свой. Если не хотите его изменения, делайте свои компоненты, которые не будут использовать LnF.


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
Maksym
Дата 27.8.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



Цитата(w1nd @  25.8.2007,  18:46 Найти цитируемый пост)
2. В java с версии 1.5 можно ловить необработанные исключения. На поток устанавливается обработчик.

Можно пример, пожалуйста.
PM MAIL   Вверх
nornad
Дата 27.8.2007, 15:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Maksym, имеется в виду Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Maksym
Дата 27.8.2007, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


.
***


Профиль
Группа: Участник Клуба
Сообщений: 1456
Регистрация: 19.8.2005
Где: Odessa, Black Sea

Репутация: 14
Всего: 62



nornad
Ясно, спасибо.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0620 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.