Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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