Господа, может кто делал уже? Если не сложно поделитесь наработками Суть вот в чем: каждый чих надо обработать, в случае ошибки присвоить ей некой код....ну дальше там разберемся К примеру: запись чего то в файл: варианты: файла нет, прав нет, еще там что то Работа с БД...ну не знаю даже, запрос не прошел, еще что то Спасибо!
надо - обрабатывай. в чем вопрос? пиши единый класс(набор функций) для обработки и регистрации этих ошибок. можно сделать на основе исключений. можно самому возвращать некие коды ошибок, и их обрабатывать... спектр обрабатываемых ситуаций и их глубина - дело хозяйское(коды,сообщения или полный стек-трейс). все что отловили - протоколируем. чтоб потом можно было обработать. построить графики или просто разобраться в сбое.
а надо ли код? сейчас принято использовать различные классы исключений. ошибки и варнинги можно также транслировать в исключения. из доков: Код (PHP): function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, $errno, 0, $errfile, $errline); } set_error_handler("exception_error_handler"); необработанные в try-catch исключения лови в set_exception_handler и логируй с трейсами. внятные тексты ошибок + стек вызовов решают всё.
У меня просто ловятся ошибки и пишутся каждая в отдельный файл в зависимости от класса. Файл для ошибок БД, файл для ошибок пыха, файл для пользовательских ошибок и тд. Пишу дату, код, сообщение, файл, строку, все как обычно. Тут усложнять особо ничего не нужно, имхо. Да, еств, при этом пользователь никаких ошибок не видит. Стектрейс? Ну хз, пожалуй имеет смысл, да.
и тут возникает интересный момент с "собаками" и разрывом шаблонов у некоторых упертых товарищей. Best Practices: Symfony2 https://github.com/symfony/Filesystem/blob/master/Filesystem.php#L75 Код (PHP): if (true !== @mkdir($dir, $mode, true)) { throw new IOException(sprintf('Failed to create "%s".', $dir), 0, null, $dir); } Yii2 https://github.com/yiisoft/yii2/blob/master/framework/web/A ... r.php#L255 Код (PHP): } elseif (@filemtime($dstFile) < @filemtime($src)) { copy($src, $dstFile); if ($this->fileMode !== null) { @chmod($dstFile, $this->fileMode); } } В некоторых случаях осознанное использование собак — лучший выход.
Код (Text): if (true !== @mkdir($dir, $mode, true)) А в чем смысл использовать йода-стайл, когда ведется строгое сравнение? О_о З.Ы. Имхо, лучше стараться кодить без собак. Забытая где-то собака может потом больно укусить.
причина: варнинги и нотисы. хороший пыхарь пишет код, отлавливая в developer все предупреждения. есть ситуации, связанные с вводом-выводом, когда появление варнинга предсказать нельзя. тогда его приходится экранировать и полагаться на возвращаемый признак успеха. что и показано в примере. то, что в production варнингов и без этого не должно быть видно, ничего не меняет! Добавлено спустя 5 минут 24 секунды: что за термин? это когда телега впереди лошади? мне такой стиль не нравится, как и тебе. я на одном собеседовании спорил по теме, а потом не поленился и почитал. пишут так как бы для того, чтобы случайно не пропустить один символ "=", что не будет синтаксической ошибкой и поэтому может не заметиться. в данном примере это конечно бессмысленно, просто по привычке наверное написали.
Бред, имхо. Такую ошибку делают только очень, очень, ну ооооочень начинающие программисты. А..ну еще паскальщики, перешедшие на любой сиподобник, да. Добавлено спустя 2 минуты 11 секунд: пример?
1) Проверить права на работу с ФС в момент установки. 2) Проверять file_exists-ом наличие указанного каталога. 3) Собака не нужна. Добавлено спустя 2 минуты 26 секунд: Я нигде, кроме пыха, не видел такое явление как собака-ошибки-заглушака, если честно. Везде без нее обходятся. Нельзя замутить простую проверку? Пфф.. Оборачивай все в трайкеч.
Я же говорил: шаблоны будут трещать. Добавлено спустя 1 минуту 42 секунды: вот тема на параллельном сайте: http://goo.gl/aUNfbr люди поумнее и поопытнее меня делятся мнениями.
Код (Text): if (true !== @mkdir($dir, $mode, true)) { throw new IOException(sprintf('Failed to create "%s".', $dir), 0, null, $dir); } Но это же индусятина, не? Почему просто в трайкетч не обернуть?
вот тут ты прав. но это пыха. здесь исключения появились совсем недавно и трайкетч не ловит ошибки и варнинги - это параллельная вселенная. Добавлено спустя 47 секунд: в пхп ошибка ≠ исключение ! Добавлено спустя 1 минуту: в php файловые функции не порождают исключений. как ты до сих пор не наткнулся на это, о, теоретик!
обсуждают оборачивание инклюдов в трайкетрчи или постановку перед ними собак, в то время, когда достаточно заюзать file_exists... И держать над кодом полный контроль. Добавлено спустя 26 секунд: Ошибки файловых функций легко предупреждаются с помощью проверок. Добавлено спустя 2 минуты 16 секунд: Читаю документацию. Юзаю встроенные функции для проверок, прежде чем провоцировать генерацию ошибок. Чесслово, очень люблю файлики, мое поделие, более того, активно генерит для себя php-файлы, без которых не может работать, то есть ввод-вывод я юзаю оч активно. Это, пожалуй, первое, что я реализовал. И вот ни разу не было ошибок внезапных. Хотя случаи бывали разные.
авотфиг. Фел, ты умный парень, но слишком максималист. главные фреймворки пишут люди с практическим опытом. Sam Dark, например, один из основных в Yii сейчас. Добавлено спустя 1 минуту 46 секунд: mkdir или chmod, например, при недостаточных правах выдадут варнинг и вернут результат "ошибка". ты что, блин, предлагаешь вручную атрибуты тестировать перед этим?
так, пани, вы меня не поняли ))) Код (PHP): set_error_handler('err_handler'); function err_handler($errno, $errmsg, $filename, $linenum) { $f = fopen('logs/бла бла', 'a'); $err = 'текст ошибки строки вся петрушка'.PHP_EOL; fwrite($f, $err); fclose($f); } Это все чудно...но это все для меня, как для разработчика...нужно другое юзер жмакнул кнопку сохранить....и допустим в этот момент "что то пошло не так" вот все ситуации что пошло не так, надо обработать, и сказать юзеру, мол код ошибки 2676886 смотри в док. вроде бы все просто...но блин....получается проверять нужно ваще все и вся и всегда и вообще....я как подумаю сколько эту петрушку писать...да и 100% предусмотреть 100% защиту от дурака невозможно. я и спрашиваю, может кто писал, может примеры какие видел? я ничего толкового не нагуглил (
Насчет того, кто что пишет. Я не максималист. Я объективен. Если "великий человек" делает хрень, я вижу хрень, а не тренд или глубокий замысел. Исандро, вон, показывал листинг, где в симфони что-то около тысячи строк простыней убито на то, чтобы точно(tm) определить текущий домен. Зачем? Оверинжиниринг и усложнение простых вещей это не круто. Но это как рак - повсюду.
А может не нужно? Коды ошибок нужны разработчикам. Если разработчик дурак - его проблемы. А пользователю просто можно сказать "ошибка в работе сервера, приносим извинения", в то время как реальное содержание ошибки уходит в лог, где его будет курить умный разраб. Или я не правильно понял? Я к тому, что перехватывай ошибки, как их дает пых. Разраб разберется. Не надо выдумывать свою систему кодов на все случаи жизни. Убьешься, а толку не особо много. Добавлено спустя 1 минуту 12 секунд: Ой брось, make_fucking_system_test(); после переноса и вся любовь. Никто не просит выпиливать проверяющий код после инсталляции. Не нужно усложнять простые вещи, ребят.
беда в том, что что бы курить каждые заеб юзера, надо 5 тел посадить логи разбирать ((( есть же товарищи которые могут грохнуть папку с классами с словами я ее не создавал, мне не нужна ) Добавлено спустя 1 минуту 4 секунды: плюс к этому ОЧЕНЬ часто бывают косяки со стороны хостеров, то с правами то БД "пропала" то еще какая шняга...
-Пожалуйста, переустановите продукт. И в соглашении пользователя пропиши пункт, что если пользователь начал херить системные файлы, то сам себе буратино и разработчик ответственности не несет. Добавлено спустя 1 минуту 3 секунды: ВОт по этому я за наличие комплексной проверки, которая сразу скажет, насколько текущий сервер пригоден к работе с продуктом. Добавлено спустя 1 минуту 56 секунд: Далее. Ошибки типа "бд пропала" ловятся пыхом на раз. Послали запрос, пришел таймаут - говорим юзеру, что сервер поплыл бородой.
Fell-x27, это я показывал класс Request симфони. и ты не понял контекст применения. я с самого начала об этом пишу: перехватывай ошибки (и варнинги) и порождай исключения — в одном месте! считай, что по умолчанию файловая ошибка это капец! а где не пиздей — см. ниже. аналогично с функциями БД. PDO можно настроить чтобы он сам выдавал исключения, но если у тебя mysql/mysqli, то порождай исключение сам — в своем классе-обертке — в одном месте! если надо, где-то в цепочке вызовов можешь вставить try-catch чтобы поймать такое исключение и выдать внятный мессидж и залогировать. а где-то, где не стОит прерываться из-за отстутствия файла или чего подобного — ставь собаку и реагируй на то, что вернулся индикатор ошибки. нет абсолютных истин. собака плоха для нуба, а для умного человека это один из инструментов.
Пойми одну вещь...я хочу юзеру сразу сказать в чем и где косяк и ссылку на документацию. 50-70% пользователей сами смогут исправить ошибку а не дергать сапорт. Это снимет нагрузку на поддержку в разы (( это Fell-x27