Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: дискуссии по теме [3]

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (5): « 1 2 [3] 4 5 »   

> Без описания
caballero
Отправлено: 28 Октября, 2011 - 15:04:58
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Если эту ситуацию нельзя предусмотреть, то как же можно догадаться, что тут надо написать код, который должен бросить исключение?

Поэтому его и не надо бросать - о чем я и говорю.

Цитата:
Исключителдьная ситуация - это такая, которую всегда НУЖНО предугадать и обработать


тогда в чем ее исключительность если я знаю что тут может произойти и могу написать обработчик на месте и продолжить выполнение программы а не игнорировать логику и последовательность выполнения программы перебрасывая выполнение программы куда то в конец.
Это типа goto против которого многие боряться только еще хуже -goto хоть в одном блоке кода а исключение может пролететь десяток исходников - и разбирайся что там случилось.
(Добавление)
Цитата:
как в IDE а точнее где
искать список исключений которые генерирует тот или иной метод?


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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Champion Супермодератор
Отправлено: 28 Октября, 2011 - 15:09:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




caballero пишет:
Это ты должен доказывать преимущество. Доказывать должна сторона выдвигающая аргументы.
Доказывать должна сторона, пытающаяся вести диалог конструктивно. Это к обоим сторонам относится.
Со стороны сторонников ексепшнов Stierus код привел. Я правда, не очень увидел в нем все преимущества)
Я свои основные мысли в предыдущих 2 постах описал.
DlTA пишет:
как в IDE а точнее где
искать список исключений которые генерирует тот или иной метод?
Если в стиле явадок описаны эти исключения, то при наведении мышкой будет выскакивать подсказка
 
 Top
DlTA
Отправлено: 28 Октября, 2011 - 15:20:01
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




вот мой код
Спойлер (Отобразить)


как правильно прокоментировать возможные исключения
чтоб чтоб при использовании данного класса я сразу смогу в хорошей IDE заметить
перечень возможных исключений и обработать их
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 15:21:28
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Stierus код привел. Я правда, не очень увидел в нем все преимущества)


Я вообще не увидел - то есть смысла в таком коде - ноль

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DlTA
Отправлено: 28 Октября, 2011 - 15:27:43
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




caballero пишет:
а где было выброшени исключение - фиг его знает.


Спойлер (Отобразить)

(Добавление)
это уже не только технология обрыва работы
а скорее метод отделения обработки ошибок
от остального кода
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 15:46:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
это уже не только технология обрыва работы
а скорее метод отделения обработки ошибок
от остального кода

Каких ошибок?
Дико извиняюсь но когда ршибька в запросе то нужно исправлять код - не может быть никаких ощибок в запросе.
Емли юзер ввел неверныхх паротль - эо тоже не ощибка программы - это просто несоответствующие бизнес-данные - это предсказуемая ситуация которую нужно нормально обработать на месте и принять решение куда программа идет дальше.
Откуда вообще эта дикая идея что программа должны быть в одном месте а ошибки обрабатыватся в другом.

.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Stierus Супермодератор
Отправлено: 28 Октября, 2011 - 15:51:09
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




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

-А что означает API?
-Я даже не знаю, но что-то мне не нравится ... в слове всего 3 буквы, а ничего хорошего тремя буквами не назовут.
-Коллега, я думаю, вы не правы, не стоит так рано судить вещь лишь по названию
-нет-нет, я точно уверен, что ничего хорошего вещь с таким названием принести не может
-Хорошо, предлагаю обсудить полезность четкого соблюдения правил написания api на форуме php.su ...
 
My status
 Top
DeepVarvar Супермодератор
Отправлено: 28 Октября, 2011 - 15:53:20
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




caballero пишет:
Откуда вообще эта дикая идея что программа должны быть в одном месте а ошибки обрабатыватся в другом
Мне это будет удобным. Но не в такой степени чтоб на каждый if.
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 16:02:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Я пока не увидел ни одного куска кода, работающего без исключений


скачай исходники например PHP или Mysql или Апач
(Добавление)
Цитата:
Мне это будет удобным. Но не в такой степени чтоб на каждый if.


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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Champion Супермодератор
Отправлено: 28 Октября, 2011 - 18:39:45
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




DlTA пишет:
как правильно прокоментировать возможные исключения
чтоб чтоб при использовании данного класса я сразу смогу в хорошей IDE заметить
перечень возможных исключений и обработать их
В коде Stierus есть пример. Со словом @throws.
Stierus пишет:
Я пока не увидел ни одного куска кода, работающего без исключений
Все же в пределах форума этого куска кода никто и не приведет. Кроме короткости написанного код ничего объективно не покажет. Удобно или не удобно это - можно будет все равно спорить до посинения. Чтобы реально продемонстрировать свою правоту, нужно сопровождать проект с ексепшнами и проект с ифами. И сравнивать простоту такого сопровождения, сравнивать наступленные грабли и пропущенные ошибки. А мини-куском кода на форуме никого не убедишь в субъективных вещах. Это все-таки субъективная вещь - мы ведь не можем цифрами измерить свою правоту. Так что здесь все-таки словесная перепалка более уместна.
Stierus пишет:
в слове всего 3 буквы, а ничего хорошего тремя буквами не назовут.
Мы пишем более обоснованные вещи, чем это)

caballero пишет:
когда ршибька в запросе то нужно исправлять код - не может быть никаких ощибок в запросе.
Да.
caballero пишет:
Емли юзер ввел неверныхх паротль - эо тоже не ощибка программы - это просто несоответствующие бизнес-данные - это предсказуемая ситуация которую нужно нормально обработать на месте и принять решение куда программа идет дальше.
Это тоже да. Бросать исключения при неверном логине и пароле - такое бывает, но правильность этого сомнительная - я согласен. Но фатального в таком не увижу.
Я приводил пример с карандашами с Машей и Васей. Если мы смогли вычислить кол-во карандашей - хорошо. У нас в бизнес логике предусмотрено, что делать в этом случае. Еслине смогли - это исключительная ситуация.
caballero пишет:
Откуда вообще эта дикая идея что программа должны быть в одном месте а ошибки обрабатыватся в другом.
Эта идея имеет много общего с отделением логики доступа к данным от бизнес-логики и отделения логики представления от них обоих.

Еще раз:
Цитата:
Еше раз - исключительная ситуация - та которую нельза предусмотреть а соответственно написать код для обработки.

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

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

Спор ни о чем. Я понимаю, что никто из нас не переубедит никого. Мы уже начинаем идти по кругу.
caballero пишет:
Это типа goto против которого многие боряться только еще хуже -goto хоть в одном блоке кода а исключение может пролететь десяток исходников - и разбирайся что там случилось.
в GOTO нет ничего плохого. Людям мало одного GOTO - придумали ексепшны.
Дело в том, что и тем, и другим надо грамотно пользоваться - и будет удобно, правильно и замечательно.
Можно и из ифов нагородить такое дерьмо, что в страшном сне не приснится.
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 19:07:41
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




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


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


Цитата:
Данные, выходящие за предусмотренные рамки, отсутсвие доступа, разрыв коннекта, сигнал kill - всё это должно быть предусмотренно, и это не бизнес логика. Это логика исключительных ситауций.

Именно так - а не как вышеприведенном коде - использовать исключение вместо return.

(Отредактировано автором: 28 Октября, 2011 - 19:10:05)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Champion Супермодератор
Отправлено: 28 Октября, 2011 - 19:08:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




caballero пишет:
скачай исходники например PHP или Mysql или Апач
Все их я конечно не изучал. Допустим, там правда нет исключений. Они на Си (не ++) написаны большей частью - поэтому отсутсвие исключений объяснимо. Еще одно объяснение - исключения могут снизить производительность, а в таких проектах она очень важна. Однако, в большинстве существующих сейчас проектов важна именно не требовательность к ресурсам а удобство сопровождения. И пожертвовать разумное количество ресурсов для облегчения производительности и уменьшения ошибок - полезно
(Добавление)
caballero пишет:
Я имел ввиду когда ситуацию нельзя исправить и продолжить выполнение , например нет конекта к базе. Предусмотреть ситуацию мы не можем в том смысле что мы не можем спрогнозировать что это случится в этом месте.

Почему? Я всё-таки напишу код.


PHP:
скопировать код в буфер обмена
  1.  
  2. Без ексепшнов
  3. if (false === $dh = db_connect()) {
  4.         die(не соединились);
  5. }
  6. start_transaction();
  7. if (false === $qh = db_query($qsl1, $dh)) {
  8.         rollback();
  9.         die(отвалились во время запроса(или запрос неверный))
  10. }
  11. if (false === $qh = db_query($sql2, $dh)) {
  12.         rollback();
  13.         die(отвалились во время запроса(или запрос неверный))
  14. }
  15. commit();
  16. return 0;
  17.  
  18.  
  19. А вот так - если бы функции соттусе и query бросали исключение
  20. try {
  21.         $dh = db_connect()
  22.         start_transaction()
  23.         $qh = db_query($sql1, $dh)
  24.         $qh = db_query($sql2, $dh)
  25.         commit()
  26. } catch() {
  27.         rollback();
  28.         die(exceptionMessage)
  29. }

Четко видна последовательность действий(безнес-логика) в нижнем случае. Нет дублирования кода. А в верхнем случае - лесенка, которую неприятно читать и разглядывать действие, исполняющее бищнес логику, которое встречается одно на 3 строки.

caballero пишет:
этом смысле в нашей функции ничего бросать и не надо - оно уже будет выброшено. А мы пишем только бизнес логику - проверяем пароль там и все такое.
Да, я согласен.
Оно уже будет выброшено. Но если мы пишем эти функции, то мы-то как раз и должны бросить исключение.
Опять же вернемся к Маше с Васей. Мы считаем у них карандаши. Мы не нашли Васю, не смогли посчитать карандаши у него - это такое же исключение, как и потеря коннекта к базе. Мы знаем, что Вася двигается, мы можем предусмотреть, что он смоется куда-то, когда не надо. Это исключительная ситуация. Мы можем ее выбросить. А может нету Маши, может еще что-то. То же самое и в примере выше - не удались выполнить первый запрос. А может второй. А может 48й...

Вы говорите, что бросать исключения надо тогда, когда программа не может дальше выполняться.
Вот у нас есть регистрация. Проверка корректности данных, проверка существования логина, сохранение в базу, сланье на почту приветствия и ссылки для активации аккаунта.
Произошло так, что такой логин уже существует. Наша программа дальше выполняться не может. Она должна прекратитьс и выдать, что логин уже существеут.
Разве нет?
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 19:57:15
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Но если мы пишем эти функции, то мы-то как раз и должны бросить исключение.

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


"(или запрос неверный)" - а это косяк в коде который нужно выявить в результате тестирования и исправить.

Цитата:
Произошло так, что такой логин уже существует. Наша программа дальше выполняться не может. Она должна прекратитьс и выдать, что логин уже существеут.
Разве нет?

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Champion Супермодератор
Отправлено: 28 Октября, 2011 - 20:16:58
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




caballero пишет:
Это бизнес логика. Вы получили данные обработали их и возвратили результат.
(речь о существующем логине)
Это ошибка. Я показываю пользователю сообщение об ошибке и прошу его что-нибудь сделать потому что сам не могу - не стану же я приписывать к его логину unqid() или еще что-то, делать его уникальным и успешно продолжать работу. Мы не можем знать, как тут поступить и что сделать с логином. Это самая настоящая исключительная ситуация на самом деле.

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

caballero пишет:
Другое дело - обрыв конекта. В этом случае вы не можете делать ничего. Причем обрыв может произойти в любом месте программы в отличие от предусмотренной обработки логина.
Ну он может произойти только в тех местах, где выполняется запрос к БД. Так что множество таких мест вполне определено и конечно.
Но тут, как ни странно, мы можем попробовать что-то сделать (в отличие от повторяющегося логина). Мы можем предпринять N повторных попыток выполнить запрос. Можем инициировать переключение на работу с зеркалом источника данных и продолжить работу. Можем пнуть скрипт, который поднимет упавший сервер БД и повторить попутку запроса.
Есть варианты. Несколько экзотические, но есть. А в случае с логином нет никаких вариантов кроме как прекратить работу и попросить пользователя ввести логин.

Так что по твоей логике стоило бы бросить ексепшн при неверном логине, но не стоит бросать его фейле с коннектом
(Добавление)
caballero пишет:
"(или запрос неверный)" - а это косяк в коде который нужно выявить в результате тестирования и исправить.
Да, надо. Но вероятность пропустить неверный запрос есть, так что можно завернуть этот код в исключения. Если это исключение никогда в жизни не бросится - мы ничего не проиграем. Если бросится - увидим и исправим.
"Неверный запрос - это косяк в коде" - с этим утверждением никто не спорит.
 
 Top
caballero
Отправлено: 28 Октября, 2011 - 20:42:56
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




Цитата:
Это ошибка. Я показываю пользователю сообщение об ошибке и прошу его что-нибудь сделать потому что сам не могу - не стану же я приписывать к его логину unqid() или еще что-то, делать его уникальным и успешно продолжать работу.


Ошибка пользхователя а не программы.

Цитата:
Мы не можем знать, как тут поступить и что сделать с логином.


Очень даже можем - переправляем его обратно и просим ввести по новой. По дороге например капчу перерисовываем и все такое.


Цитата:
Ну он может произойти только в тех местах, где выполняется запрос к БД.

то есть в стопицот местах особенно если это большая и сложная ЦМС или портал.
Цитата:
Так что множество таких мест вполне определено и конечно.


Да. Но неопределено в каком коонкретно месте и в какое время.


Цитата:
Но тут, как ни странно, мы можем попробовать что-то сделать (в отличие от повторяющегося логина). Мы можем предпринять N повторных попыток выполнить запрос. Можем инициировать переключение на работу с зеркалом источника данных и продолжить работу. Можем пнуть скрипт, который поднимет упавший сервер БД и повторить попутку запроса.


Тогда исключения не будет. И вообще ошибки не будет - функция отработает штатно.

Цитата:
Так что по твоей логике стоило бы бросить ексепшн при неверном логине
Это не по моей логике.



Цитата:
Но вероятность пропустить неверный запрос есть, так что можно завернуть этот код в исключения.

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (5): « 1 2 [3] 4 5 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Прочее »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB