Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой смысл в исключениях (Exeption)? 
:(
    Опции темы
Gold Dragon
Дата 2.7.2012, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Вот пытаюсь осознать необходимость вставлять Исключения в свой проект. И чем больше разбираюсь, тем больше задаю себе вопрос: "А зачем оно надо?"

Моё размышление примерно такое..

- Почему я перед использованием чего-либо не могу сначала проверить на существование этого чего-либо?

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

- Если мне нужна отладка кода и получение что и где работает, то почему бы мне просто не включить вывод ошибок и (или) просматривать логи сервера?

- Зачем мне вообще ловить ошибку, а не пытаться её избежать?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Zerstroer
Дата 2.7.2012, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

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



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

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

Добавлено через 14 минут и 58 секунд
Вообще, перечитал ваши вопросы отвечу об исключениях более глобально:
Исключения - это способ работы программы в нештатном состоянии.
Цитата(Gold Dragon @  2.7.2012,  18:54 Найти цитируемый пост)
- Почему я перед использованием чего-либо не могу сначала проверить на существование этого чего-либо?

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

- Если мне нужна отладка кода и получение что и где работает, то почему бы мне просто не включить вывод ошибок и (или) просматривать логи сервера?

- Зачем мне вообще ловить ошибку, а не пытаться её избежать? 


1. Проверку на существование чего-либо можно возложить на исключение. т.е. система считает, что что-либо, существует. А если нет, то меры принимаются в блоке отлова исключений (в идеальном случае - он один на всю систему).
2. Необходимость в работоспособности сломанного кода - диктуется требованиями к надежности и работоспособности системы.
3. Логирование системы можно осуществить и с исключениями и без них.
4. Некоторых ошибок избежать, теоретически, невозможно, так как вы можете и не знать о том, что они могут возникнуть. Как вы будете избегать ошибку, если не знаете - где она?


--------------------
In silico
PM MAIL ICQ   Вверх
Gold Dragon
Дата 2.7.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Принцип работы исключений я понимаю. Я не понимаю их такую великую значимость.. Разве при написании кода я не должен избавляться от "нештатных" ситуаций?

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


Цитата(Zerstroer @  2.7.2012,  22:20 Найти цитируемый пост)
4. Некоторых ошибок избежать, теоретически, невозможно, так как вы можете и не знать о том, что они могут возникнуть. Как вы будете избегать ошибку, если не знаете - где она? 
Например? И почему же я не буду знать где она произошла?



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Zerstroer
Дата 2.7.2012, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

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



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

Цитата(Gold Dragon @  2.7.2012,  20:00 Найти цитируемый пост)
Например? И почему же я не буду знать где она произошла?

1. Если вы используете чужую библиотеку.
2. Банально при работе с СУБД.
Использование исключений - избавляет от необходимости постоянно проверять по ходу выполнения программы возвращаемые статусы выполнения функций.

Я так понял, свой проект вы разрабатываете на PHP.  Используете ли вы ООП в своём проекте?







--------------------
In silico
PM MAIL ICQ   Вверх
Gold Dragon
Дата 2.7.2012, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Цитата(Zerstroer @  2.7.2012,  23:16 Найти цитируемый пост)
Я так понял, свой проект вы разрабатываете на PHP.  Используете ли вы ООП в своём проекте?
Конечно.. Модернизирую CMS, т.е. избавляюсь от пережитков PHP < 5 и прибавляю хорошести PHP > 5.3

Цитата(Zerstroer @  2.7.2012,  23:16 Найти цитируемый пост)
Gold Dragon, я еще раз повторюсь - использование исключений - это стиль написания программы, не более. 
Вот и я про это... Если потому что "так принято" или "так правильнее", то просто не осознаю нужности smile

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

PSS
Мне кажется что исключения тоже из этой области и нужны в большей части на стадии проектирования и осознания идеи



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Zerstroer
Дата 2.7.2012, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

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



Gold Dragon, про ООП я спросил по причине того, что идея использования исключений хорошо сочетается с идеями Объектно-Ориентированного Программирования. Но единственно верной и обязательной, естественно, не является. Исключения - полезный инструмент в ООП. Главное - что бы исключения хорошо сочетались с общей концепцией проекта и их использование должно быть заложено на стадии проектирования. Исходя из этого, могу лишь дать совет.
Если вы занимаетесь рефакторингом проекта и ранее в нем исключения не использовались, лучше оставить всё как есть т.е. исключения в проект не вводить, есть риск сильно всё попортить.
Если собираетесь спроектировать проект заново и с использованием ООП. Продумайте концепцию использования исключений на  этапе проектирования (не конструирования!) классов.




--------------------
In silico
PM MAIL ICQ   Вверх
Gold Dragon
Дата 2.7.2012, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



переход на PHP 5.3+ приводит к замене не только функций, но и к изменению логики. По моим подсчётам будет переписано практически 50%. По этому  решил осознать необходимость включение в проект исключений. особого труда это конечно не составит. А вот стоит ли овчинка выделки, узнать хочется smile


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Nikolja
Дата 2.7.2012, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 24.2.2009
Где: Черкассы

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



Цитата(Gold Dragon @  2.7.2012,  22:00 Найти цитируемый пост)
И почему же я не буду знать где она произошла?
 "Человеку свойственно ошибаться", -- говорили ещё в Древнем Риме. 
user posted image"Errare humanum est."

Даже опытные люди, набирая код, могут забыть что-то элементарное. Потому в некоторых языках программирования, например в Java, во всех случаях, когда ошибка может "подвесить" всю систему, принудительно заставляют программиста использовать исключения. И это не из занудства, а наоборот, -- выигрывают от этого все. Надёжность программного обеспечения, называется. 

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

PM MAIL   Вверх
Zerstroer
Дата 2.7.2012, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

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



Gold Dragon, если вы проект перепроектируете с использованием ООП, то думаю, что заюзать исключения - стоит. Если производите рефакторинг (качественное улучшение кода без изменения функциональности и потери работоспособности) - лучше оставить все по старому. Слишком уж сильно должна будет поменяться логика. Не стоит насильно внедрять подобные вещи, лучше их заложить в новом проекте, иначе просто - опасно.
Просто, вам нужно просечь фишку от использования исключений, вопросов бы и не возникло вовсе.

Добавлено через 13 минут и 10 секунд
Цитата(Nikolja @  2.7.2012,  20:53 Найти цитируемый пост)
 принудительно заставляют
 smile кто заставляет?



--------------------
In silico
PM MAIL ICQ   Вверх
Sentox
Дата 2.7.2012, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


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

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



Слово исключение говорит само за себя, как отдельный поток перехвата ошибок.
Пример с 
Цитата

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


Произошёл сбой при работе с запросом на удалённый сервер (сервис), не важно по какой причине (неправильный указан хост или сам сервис не ответил вовремя). В методе запроса есть путь алгоритма прямолинейный, что означает высокую читаемость кода и более правильное построение функции (это кстати к Zerstroer, про возращение статусов из функций/методов: обратите внимание на строго типизированные языки они задают один тип возврата, что само по себе правильно), но при этой ситуации мы как бы говорим что не знаем что делать и отдаём на откуп тем кто может сделать и присваиваем тип исключения например NotShowException (к таким же исключениям относятся и DBException и др. системные, которые не стоит показывать пользователю). При перехвате такого исключения, "клиент", на основании типа, может реализовать алгоритм например логирования или вывода пользователю ошибки и обращения к администрации, или приостановить и попытаться заново подключиться к сервису. 
То есть логику исключительных ситуаций клиент может определять по своему, при чём клиенты могут быть разными и реализовывать по разному. Предугадываю вопрос, какая разница , если возвращать статус.
Возвращать статус можно, и встречный вопрос а если сбоев в одном методе более напримр 3, как начинает код захламляться и это с учётом того что эти статусы нужно где то определить и научить клиента их понимать и различать, это первое.
Второе, сообщение об ошибке, номер строки, файл вызвавший ошибку и трассировка к этой ошибке - только этот набор уже должен перетянуть весы smile, так как всё это целыми массивами отдавать из метода это безумие.
Третье, при генерации исключения можно в объект заносить так же свои данные, например отладочные сообщения или объекты формы с ошибками, чего не сделаешь с помощью возвращения статусов ошибок (ну или можно но это будет куча хлама и костылей)
Вчетвёртых, чисто концептуально исключения это поток ошибок, что отделяет концепцию управлением ошибками (безопасное программирование) и основные потоки алгоритмов.
В пятых, улучшается проектирование методов и классов за счёт отделения нормальной логики от логики ошибок, то есть программист сосредотачивается на нормальном ходе алгоритма и его оптимизации, а исключения просто отмечает псевдокодом. 

Это сообщение отредактировал(а) Sentox - 3.7.2012, 00:02
PM MAIL   Вверх
Gold Dragon
Дата 3.7.2012, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



а вот тогда такой вопрос... У меня стоит (при отладке) максимальный вывод ошибок самим сервером. В случае моей ошибки вылетает и в каком файле и в какой строке и что за ошибка. Исключение ведь сделает тоже самое, ну или почти тоже самое.. И тем более зачем вообще конечному пользователю знать что происходит? Если есть ошибка, то просто остановить выполнение и ничего не выводить, в т.ч. и сообщения исключений


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Zerstroer
Дата 3.7.2012, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

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



Цитата(Gold Dragon @  3.7.2012,  06:02 Найти цитируемый пост)
У меня стоит (при отладке) максимальный вывод ошибок самим сервером. В случае моей ошибки вылетает и в каком файле и в какой строке и что за ошибка. Исключение ведь сделает тоже самое, ну или почти тоже самое.. И тем более зачем вообще конечному пользователю знать что происходит? Если есть ошибка, то просто остановить выполнение и ничего не выводить, в т.ч. и сообщения исключений 

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


--------------------
In silico
PM MAIL ICQ   Вверх
Sentox
Дата 3.7.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


как то так
**


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

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



Цитата(Zerstroer @ 3.7.2012,  09:38)
Цитата(Gold Dragon @  3.7.2012,  06:02 Найти цитируемый пост)
У меня стоит (при отладке) максимальный вывод ошибок самим сервером. В случае моей ошибки вылетает и в каком файле и в какой строке и что за ошибка. Исключение ведь сделает тоже самое, ну или почти тоже самое.. И тем более зачем вообще конечному пользователю знать что происходит? Если есть ошибка, то просто остановить выполнение и ничего не выводить, в т.ч. и сообщения исключений 

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

В том и смыл, что происходит остановка и ничего не происходит. Но есть ошибки которые PHP просто не считает таковыми. Например тот же сценарий удалённой работы или ошибки БД (не синтаксических запросов!, а допустим не существующих записей) при этом требуется выводить страницу с извинениями пользователю. Для этого в поток типа исключения например NotFoundException  пускаем сообщения, при чём записываем в лог полностью сообщение, файл строку и трассировку, и здесь же выводим страницу с извинениями или с обращением в службу поддержки. То есть ошибки чисто сценарные а не критические или предупреждения.
PM MAIL   Вверх
Gold Dragon
Дата 3.7.2012, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

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



Цитата(Sentox @  3.7.2012,  15:02 Найти цитируемый пост)
а допустим не существующих записей
Тогда совсем не понятно.. Зачем мне этот обработчик исключений, когда я могу в скрипте сделать эту проверку и красиво преподнести это пользователю, а не выдавать ошибки..



--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Zerstroer
Дата 3.7.2012, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.8.2007
Где: Алма-Ата

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



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

Добавлено через 1 минуту и 17 секунд
Цитата(Gold Dragon @  3.7.2012,  12:07 Найти цитируемый пост)
Зачем мне этот обработчик исключений, когда я могу в скрипте сделать эту проверку и красиво преподнести это пользователю, а не выдавать ошибки..

Вы не видите и не ощущаете явной необходимости использования исключений. Вас устраивают имеющиеся методы обработки ошибок. Используйте их.


--------------------
In silico
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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