[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с исключениями и trigger_error
Страницы: 1, 2, 3, 4
bestxp
И что ты за пример привел ? ну указывают E_DERPECATED так и что?

Потому что они не строят логики приложения на этих "ошибках" да и ошибки по сути нет, напоминание что это устаревший метод, еще доводы?

Исключение нужно обрабатывать , а не логировать

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

а как ты с trigger error это сделаешь? Костыли через обработчики ошибок ? Уводить логически в дебри? Ну его нафиг , это уже код с запашком исключительного говница)
twin
waldicom
Ты почему из контекста вырвал? Полный текст приведи:
Цитата
The '.__METHOD__.' method is deprecated since version 2.6 and will be removed in 3.0.

Я умею читать. Не trigger_error deprecated, а сам метод. Почему они ексепшен не кинули? Все просто. Потому что в этом месте не нужно останавливать скрипт. Это предупреждение. И тут использовать exception просто не выйдет. А в лог написать надо, чтобы снять с себя ответственность.

Именно для этого мне триггер и нужен. Чтобы логировать всё, что делает юзер, не мешая ему при этом жить.

А для любителей "новизны" есть режим "exception". Который тоже логируется. tongue.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
bestxp
Это скорее для тех кто не читает что написано в документации что это Deprecated и я уверен целиком и полностью что такой пользователь и логи не читает если у него ничего не падает, а если упало тогда уже полезет в код и увидет что метода уже нету

а зачеркнутый метод в IDE видно сразу и сразу понятно что deprecated так что по сути это безполезное использование
twin
Цитата (bestxp @ 30.10.2015 - 10:11)
Потому что они не строят логики приложения на этих "ошибках" да и ошибки по сути нет, напоминание что это устаревший метод, еще доводы?

Вот именно! А ты говоришь устарело. Есть варианты, когда без него никак. Зачем скрипт тормозить на deprecated, если он сейчас работает и может еще сто лет проработать?

Мне это нужно. Я не для вас фреймворк пишу, а для тех, кто только учится использовать ексепшены. И это очень подходящее решение. Компромиссное.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (bestxp @ 30.10.2015 - 10:11)
Исключение нужно обрабатывать , а не логировать

Вот я сто раз тоже самое говорил. Только ты акценты переставляешь.

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

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (bestxp @ 30.10.2015 - 10:15)
и я уверен целиком и полностью что такой пользователь и логи не читает если у него ничего не падает, а если упало тогда уже полезет в код и увидет что метода уже нету

Ты мыслишь как пользователь фреймворка. А разработчик должен предугадывать все варианты. Здесь они правы на 100%. Придет новый программер на проект, нафиг ему шарится по докам и файлам. Он лог посмотрит и все поймет.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Oyeme
Цитата
Что он ответил? А, понятно. Не предвидится все-таки. Так вот и славно. Я больше скажу. Заапплодировали такие как вы. А вот эти не апплодировали, как пить дать. И это, мне не изменяет зрение? Это правда твоя любимая Symfony? Я насчитал в ней 67 вызовов trigger_error()/ Вот говнокоднры то!


Читаем описание класса
Цитата

/**
* A generic ErrorHandler for the PHP engine.
*
* Provides five bit fields that control how errors are handled:
* - thrownErrors: errors thrown as \ErrorException
* - loggedErrors: logged errors, when not @-silenced
* - scopedErrors: errors thrown or logged with their local context
* - tracedErrors: errors logged with their stack trace, only once for repeated errors
* - screamedErrors: never @-silenced errors
*
* Each error level can be logged by a dedicated PSR-3 logger object.
* Screaming only applies to logging.
* Throwing takes precedence over logging.
* Uncaught exceptions are logged as E_ERROR.
* E_DEPRECATED and E_USER_DEPRECATED levels never throw.
* E_RECOVERABLE_ERROR and E_USER_ERROR levels always throw.
* Non catchable errors that can be detected at shutdown time are logged when the scream bit field allows so.
* As errors have a performance cost, repeated errors are all logged, so that the developer
* can see them and weight them as more important to fix than others of the same level.
*
* @author Nicolas Grekas <p@tchwork.com>
*/
twin
Oyeme
Я надеюсь это ты не мне написал? smile.gif

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Arh
Цитата (twin @ 29.10.2015 - 22:33)
Нет. Оно показывает от того места, где было брошено. А бросается оно всегда в одном месте. А значит место ошибки не видно. В месте ошибки стоит trigger_error, а не throw по моей схеме.

Сегодня попробовал что то накодить, делаю throw new \Exception('Тестовая ошибка'); или trigger_error('Тестовая ошибка');
Получаю путь к файлу и строку с ошибкой. Всё там видно вроде.

user posted image

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
chee
twin, давай рассуждать рационально, прям как ты любишь. Я человек простой, когда подключаю библиотеку, надеюсь что она будет как то сигнализировать о нештаных ситуациях, если она будет это делать через экспешены, то мне не нужно дополнительных средств что бы отловить их, в твоем же случае мне нужно задать обработчик ошибок который будет вызывать эксепшены, и лишь потом отлавливать эти эксепшены, а так как например, у меня в системе не было обработчика ошибок и кое где проскакивали ни на что не вляющие нотисы, то мне придется дописывать обработчик ошибок для фильтрации определеных типов ошибок. В итоге, что получается, в случае эксепшенов я беру и использую, в случае trigger_error я беру и ещё до настраиваю, и все лишь из-за того что у создателя мега тараканы в голове.

Ну и как обойти тот факт, что при использовании trigger_error у тебя происходит: вызов trigger_error, потом обработчик ошибок, выброс иксючения, отлов исключения. В случае же использования исключений, порядок таков: выброс исключения, отлов исключени. Ты же говорил, что то о ресурсах, чем не довод.

И да, логгирование в случае эксепшенов сделать не трудно. Наследовался от стандартного эксепшена, в конструкторе сделал вызов логера, потом везде наследуешься от этого эксепшена, а при вызове у тебя все автоматически логируется, ????, профит!

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
chee
Я тебя прекрасно понимаю. И понимаю доводы всех, кто против. Ну кроме одного, что trigger_error устаревшая штука. Я показал на Симфони, что нифига не устаревшая, и хотя бы в таком случае exception не годится.

Но вернемся к логике.

Я тебя прекрасно понимаю, ты привык к исключениям, они тебе как родные. Но далеко не все ими пользуются. Особенно начинающие. А фреймворк как раз для них.

Мне нужен низкий порог вхождения. С результатом trigger_error знакомы все, кто хоть раз пропустил точку с запятой. Это понятно, легко и просто. А когда неискушенный пользователь увидит на экране
Цитата
Fatal error: Uncaught exception 'BadFunctionCallException' with message
он помрет от страха. Я знаю что говорю, я очень много общаюсь с новичками, так как веду курсы.

Вот почему многие (и я в том числе) не любят фреймворки. Из-за непонятного синтаксиса и обилия путанной документации. Когда на экране появится такая хрень, мало кто обратит внимание на второй блок, все полезут гуглить первый (особенно если это какой-нибудь xammp или что там, который ещё и стек вываливает кашей). А гугл ничего толкового не скажет, кроме как даст совет изучить ексепшены. И теперь прикинь, сколько народу плюнет на фреймворк и вернется к привычному самопису только из-за этого.

У меня главная цель - разобраться, на сколько оправданы новомодные технологии, а как бонус - получить простой и достаточно функциональный фреймворк. С синтаксисом, близким к нативному. Соответственно с таким же поведением.

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

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

А логи, это репутация. В любой момент можно попросить показать лог и объяснить, что он сделал не так. И что фреймворк не читает мыслей и не делает все за него. И нужно обращаться с ним нежно и ласково. Тогда он ответит тем же. smile.gif

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

Я не смог решить такие проблемы:
1. Нотисы. То есть возможность продолжить скрипт после оповещения с сопутствующим этому логированием.
2. Логирование всей цепочки ошибок, а не только первой
3. Возможность использования простой логики, а не try... catch при обработке ошибок. Это важно, так как нужен низкий порог вхождения.

Еще есть мелочи, но это уже не важно, мне хватило и этого.

Самым очевидным решением влоб были бы обертки. Но чем они лучше нативного trigger_error мне не понятно. Пока из доводов я услышал что-то невнятное про древность и какашки. А это для меня не довод, ты знаешь. smile.gif

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

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Цитата (chee @ 31.10.2015 - 16:22)
Ты же говорил, что то о ресурсах, чем не довод.

В случае дебаггинга о ресурсах думать нужно в последнюю очередь. А так то да, говорил, говорю, и буду говорить. smile.gif

Цитата (chee @ 31.10.2015 - 16:22)
И да, логгирование в случае эксепшенов сделать не трудно. Наследовался от стандартного эксепшена, в конструкторе сделал вызов логера, потом везде наследуешься от этого эксепшена, а при вызове у тебя все автоматически логируется, ????, профит!

Это у меня было реализовано в первом варианте. Вернее не совсем реализовано, но вызов логера в наследнике был)) Не хватило мне этого.

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

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
chee
twin, trigger_error не устарела, по факту она не нужна, понимаешь? Устарела != Не нужна.

Цитата (twin @ 31.10.2015 - 21:08)
Преобразовать exception в trigger_error, но это потребует гораздо больших усилий (если вообще возможно, не думал)

Нахрена это делать, приведи случай такого кейса, желательно реальный.

Цитата (twin @ 31.10.2015 - 21:08)
А логи, это репутация. В любой момент можно попросить показать лог и объяснить, что он сделал не так.

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

Цитата (twin @ 31.10.2015 - 21:08)
Ну и вторая цель - получить автоматическое логирование действий юзера. Для дальнейшего анализа.

Я не фига не понял, переформулируй. Что подразумевается под пользователем? Что в себя включает анализ?

Вообще хватит прикрываться "тупыми новичками", это не довод ни разу. Это как мне говорить, что твой код говно, потому что моя соседка сказало, что она боится как ты объявляешь константы в нём. Абсурдно, да? Я думаю, да.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Razzwan
Цитата (twin @ 31.10.2015 - 21:08)
Я тебя прекрасно понимаю, ты привык к исключениям, они тебе как родные. Но далеко не все ими пользуются. Особенно начинающие. А фреймворк как раз для них.

Вот я задавал вопрос на данную тему на ru.SO Ошибки и исключения. Что когда использовать и как?

В чем же отличие, как я для себя решил. (в прочем, это мое решение совпадает с документацией php и со статьей на хабре.)

Error - ошибка - это ошибка скрипта, которую вызвал сбой системы или непредвиденные действия злого (или очень "хитроумного") пользователя. Хороший пример - опечатка в коде (ошибка парсинга) или невозможность подключиться к базе данных (ошибка работы с бд.). Ошибку ДОЛЖЕН исправить разработчик, поэтому ошибки можно и НУЖНО логировать и слать уведомления на почту разработчику, если такое приключилось.

Exception - исключение - это исключительная ситуация, которую я, как разработчик, предвидел. Т.е. я знаю, что эта ситуация будет непременно возникать в коде вновь и вновь, и мне просто иначе нужно на нее реагировать. Говорят "выбросить исключение". Т.е. заставить программу работать в этой ситуации иначе. Хороший пример - деление на ноль. Я знаю, что такое будет возникать. Когда пользователь разделит на ноль, то результат будет неопределен (или равен бесконечности) - об этом я сообщаю пользователю. Никакого логирования здесь не нужно. И уж тем более никаких мэйлов разработчику.

Исключением так же может являться любая неосновная ветка работы моего скрипта. Например, мой скрипт должен отдать пользователю какие-то данные, но пришло сообщение, что пользователь уже в них не нуждается (он передумал) - вот тебе исключение. Т.е. я прекращаю собирать данные и никуда их не отправляю (хотя основная идея моего скрипта - отправлять данные). Мне больше ничего не нужно делать. Все. Мне здесь не нужны никакие логи. Максимум, что я могу - это записать для статистики, сколько же раз всего пользователи соизволили отказаться от информации. Просто чтоб знать. Это другой механизм и его ни в коем случае нельзя путать с ошибками, которые, еще раз повторю, НУЖНО ИСПРАВЛЯТЬ.

Теперь ближе к коду. Давайте пройдемся по мануалу:
Обработкой ошибок в php занимается встроенный механизм. Когда случается ошибка (сбой системы) - этот механизм адекватно на нее реагирует: завершает выполнение скрипта, если ошибка критична, и продолжает его, если она несущественна. Все. Здесь же есть смысл записать ошибку в логи и отправить уведомление разработчику, что ему нужно ИСПРАВИТЬ код. ЛИКВИДИРОВАТЬ ошибку. Скрипт при возникновении ошибки может так же выбросить исключение (о боже!), если выставлена соответствующая настройка в php.ini или при помощи директивы error_reporting(E_ALL). Это делают разработчики, чтоб проще было ИСПРАВЛЯТЬ ошибки во время кодирования. На работающем сайте все сообщения об ошибках, которые генерирует встроенный обработчик ДОЛЖНЫ БЫТЬ ВЫКЛЮЧЕНЫ. Для пользователя на сайте НЕТ ошибок. Ошибки есть ТОЛЬКО ДЛЯ РАЗРАБОТЧИКА. Для пользователя на сайте есть только ИСКЛЮЧЕНИЯ. Т.е. запланированные реакции скрипта на возникшую ситуацию.

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

Ну и, наконец, самое главное. Копипаст из мануала, как работают те или иные функции в php:

1. set_error_handler(пользовательская функция) — Задает определенный пользователем обработчик ошибок. Т.е. разработчик решает добавить логирование в случае возникновения ошибки и отправить пользователю вместо чистого листа (заготовленного php на этот случай) красивую страничку, что мол извините, что-то пошло не так, попробуйте ка вот эту ссылку. (статус HTTP ответа 500)

2. set_exception_handler(пользовательская функция) — Задает пользовательский обработчик исключений - эта функция задает обработчик по умолчанию для случаев, когда исключение выброшено вне блока try/catch. Т.е. решает проблему его существования (для twin-а)

3. trigger_error(сообщение, статус генерируемой ошибки) — Вызывает пользовательскую ошибку/предупреждение/уведомление - тут нужно уточнить, что предупреждение и уведомление - это виды некритичных ОШИБОК. (E_USER_WARNING, E_USER_NOTICE)

4. throw new Exception('Сообщение, которое хотим передать обработчику исключений'); можно использовать в связке с set_exception_handler() без блока try catch.

Так что все твои, twin, надуманные преимущества от незнания. Сам это понял вот недавно (хотя думал, что понимаю уже давно). Нет ничего стыдного в том, что кто-то чего-то не знает. Я еще очень многого не знаю. Нам всем еще многое предстоит узнать, понять, осмыслить. wink.gif

_____________
Youtube канал WebDeveloper->Run()
Сайт для души
Gitter
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.