![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Samotnik |
|
||||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Добрый день!!
Значицца интересует такая вещь Допустим код
и
Вот. Уважаемые Знатоки, внимание вопрос... Какая разница, в том, что использовать: Мощный механизм исключительных ситуаций, или обычная проверка If-ом ??? Т.е. хотелось бы узнать, в чем преимущество исключений? Почему они так важны в Java, ведь если бы можно было обычным условием обойтись, вряд ли П.Ноутон и Ко придумывали механизм Exception |
||||
|
|||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Обойтись обычным условием можно далеко не всегда. Одно дело - определить оишбку (исключительную ситуацию) и совсем другое - обработать её. В твоём примере определение и обработка находятся в одном и том же месте, что позволяет использовать вместо исключений обычный оператор условия.
А теперь возьмём такую ситуацию: есть некий класс А, который выполняет некоторые действия на основе переданных ему значений. Причём, значения не обязательно приходят только корректные. Далее, есть класс Б, который пинает класс А с некоторым набором данных, которые ему надо обработать и получить на выходе некоторое значение (ну, скажем, у нас в классе А происходит расчёт некоторой функции и в процессе расчёта вполне возможно то же деление на нуль). Так вот, если ты в классе А используешь оператор условия с выдачей на консоль некоторого сообщения, то что делать классу Б? Что он получит в ответ на вызов? Некое "пустое" значение нереально - функция может давать результат от минус бесконечности до плюс бесконечности. Некий статус? А куда его пристроить по-нормальному (чтобы код кривым не был и легко было изменить его в будущем)? Просто завершать программу? А что скажет тебе на это пользователь? Всех этих проблем можно избежать, если использовать исключения. Причём, если тебе надо для вывода указать, скажем, строку, на которой это дело упало, ты смело можешь в классе А отловить падение и бросить дальше эксепшн, который кроме пойманного исключения содержит ещё приделанное тобой сообщение о строке, где вывалилось исключение (хотя, в принципе, стектрейс и так содержит всю информацию, но ты можешь пожелать как-то её "улучшить" или просто добавить некоторые свои "заметки"). Надеюсь, теперь стало понятнее, зачем нужны исключения? Кстати, при использовании исключений и код становится нагляднее. -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Исключения надо использовать в исключительных ситуациях
В твоем примере исключения совсем не к месту. Исключения вообще говоря не предназначены для использования внутри методов. Они предназначены для аварийного завершения метода и индикации вызвавшему коду, если произошла исключительная ситуация. А проверки, по возможности, надо делать if-ом. Вообще исключения очень ресурсоемки, гораздо более ресурсоемки чем if. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Т.е. как это? Пролистал, книгу, всю тему Exception ,так там во всех примерах исключения внутри метода описаны. Если честно, то не совсем, Пэ.Эс. Просто мой знакомый ходил на собеседование, его спросили "Что такое исключения", он ответил.. Далее последовал вопрос: "Так а зачем они нужны, ведь и обычным условием, всегда можно проверить: деление на ноль, существует ли файл(перед записью), верна ли индексация массива, и т.д." Интересно, что бы вы ответили на данный вопрос |
|||
|
||||
| fixxer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 672 Регистрация: 14.9.2006 Где: Саратов, Россия Репутация: 6 Всего: 27 |
Предположим что у тебя есть метод какого-то класса и, предположим, там осуществляется деление на число, передаваемое в качестве параметра. Возможна ситуация деления на ноль? Да, безусловно. Можешь ты ее выкупить? Да, либо поймав исключение, либо сделав банальную проверку. Хорошо, что дальше? Можешь ты в этом методе грамотно утилизировать ситуацию? Нет, максимум что ты сможешь это нагадить в лог и/или застрелиться. Что делать? Ты можешь выбросить свое checked исключение, которое обяжет вызывающий код (у которого вообще-то больше пространства для маневра, потому как откуда-то он это число взял и теоретически знает о нем больше) как-то прореагировать на ситуацию, может попросить пользователя переввести, может еще что-то, а может и прокинуть выше. Таким образом выбрасывая исключение ты можешь быть уверен, что вызывающий код будет вынужден на каком-либо уровне взять на себя ответственность, как-то обработать исключительную ситуацию и она не будет проглочена.
-------------------- ![]() |
|||
|
||||
| Maksym |
|
|||
![]() . ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1456 Регистрация: 19.8.2005 Где: Odessa, Black Sea Репутация: 14 Всего: 62 |
Проверить можно, а что дальше делать? Код, который читает файл, как правило не знает что делать если файл не найден (если, конечно, он спроектирован по уму) , соответственно обработку такой ситуации нужно поручить вызывающему коду, который это может знать, а если не знает, то отдает своему вызывающему коду и т.д. Вот это и есть механизм исключений, передавать исключительную ситуацию выше и выше, пока не найдется кто-то кто знает, что с ней делать. Хорошо сказано. |
|||
|
||||
| nornad |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1079 Регистрация: 16.2.2007 Где: в Караганде Репутация: 16 Всего: 31 |
Продолжаем. Проверить можно. А как обработать такую ситуацию там, откуда вызвали метод? Изобретать всяческие страшные коды возврата - не самый лучший способ, если только метод итак не возвращает код возврата (хорошо ли завершилось его выполнение). Вот для передачи информации об исключительной ситуации на один из вызвавших уровней и используют исключения - как тебе и объясняют, код выше "больше знает" и ему проще решить, что делать в такой ситуации. Пример: Программа должна загрузить настройки из файла. Вызывается метод загрузки настроек. Файла физически нет. Что делает метод загрузки? Выбрасывает исключение. Вызвавший его код (например, некий инициализатор) ловит исключение и решает, что делать. Можно, например, тихо записать сие событие в лог и применить некие дефолтные настройки. А можно и ругнуться сообщением пользователю (если этот файл просто обязан быть, а его нет и без него никуда). Это сообщение отредактировал(а) nornad - 13.7.2007, 18:06 -------------------- Три достоинства программиста: Леность, Нетерпение и Гордость Ларри Уолл |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Вот смотри. Я дал тебе 5 рублей и послал купить водки. Ты пошёл, проверил сколько денег - их не хватает. У тебя два пути либо ничего не делать (не есть хорошо, так как все таки жду что ты купишь, слюни глотаю), либо сообщить мне о том что нифига ты не купил. Можно ли сообщить без иключений? Конечно, например, можно возвращать boolean. В простых ситуациях когда ошибка может быть всего одна, это можно сделать. Раньше так и делали. А вот если неcтандартных, ситуаций не преусмотренных логикой прграммы, несколько, то уже boolean не подойдет. То есть придется уже возвращать int и описывать что -1 это файл не найден, 0 это деление на ноль, 1 это .... Еще прими во внимание тот факт, что кроме этого int ты ещё должен возвратить бутылку водки, все таки. Вобщем, мешанина получается, сильно все усложняет. Exceptions очень хорошо упрощают. Можно ли без них обойтись? Можно. Будет сложнее, но обойтись можно. Нужно ли? Категорически нет. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
Гарнь между проверкой и исключением бывает достаточно тонкая и сразу сказать, что и когда надо использовать бывает сложно.
У меня такой подход - если алгоритм предусматривает просто разные действия и оба являются "законными" (ложаться в алгоритм) - то тут несомненно if. И проверки могут входить в этот вариант. Если же алгоритм заходит в тупик и продолжать его нет смысла, то кидать исключение. А вот уже вид исключения может быть разный. Это может быть исключение из-за неверных данных, а может быть ошибка работы - файл недоступен или сеть отвалилась, или база упала. Исключение отдается на откуп тому, кто пытался выполнить команду. Пусть он решает, что надо делать. Недаром типов исключений много 0- для каждого свое решение. |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
2 all
Спасибо, терь все понятно. В принципе я все это читал, но было интересно ВАШЕ мнение по этому поводу. Тема вроде бы простая, но со своими заморочками. |
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Интересно. Из соседней темы зашел по ссылке на статьи Joel-а и опять, в который раз, застрял на этом сайте.
Вот такая статья там привлекла мое внимание: Exceptions
Необычно. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Там был пример, где внутри метода выбрасывается исключени и в этом же методе ловится? -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Только при возникновении и обработке исключительной ситуации, когда спешить уже обычно не нужно. Это сообщение отредактировал(а) w1nd - 14.7.2007, 12:57 -------------------- ![]() ![]() |
|||
|
||||
| goodday1941 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 709 Регистрация: 16.7.2006 Где: Украина, Киев Репутация: 1 Всего: 9 |
статеек по этой теме не подбросите?..
а то у мну тоже постояная морока с эксепшенами... пс.. может проще все можно организовать..
тоесть на сколько я понял с твоих слов каждый метод должен быть что то по типу:
а исключение уже обрабатываеться в том месте где метод вызываеться:
типо так правильно делать? -------------------- SCJP 6 |
||||||
|
|||||||
| LSD |
|
||||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Да try/catch внутри метода могут быть только для обработки ошибок других методов. Для управления выполнением надо использовать условные операторы и циклы. Допускается поймать чужое исключение, обернуть его в свое и выкинуть свое собственно исключение:
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
||||
|
|||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |