Вот подумалось на досуге... Всюду опытные люди твердят "ошибки скриптов пишутся в логи, а пользователю на них плевать" (подробности в http://phpfaq.ru/debug3) Так нафига спрашивается вообще какие либо обработчики ошибок, или даже проверки типа isset($_GET['ТРА-ЛЯ-ЛЯ']) и тому подобное ? Простой пример аплоад файла, откопав скрипт аплоада многолетней давности я нашёл чуть ли ни десяток проверок на всякие ошибки, вывод пользователю информации что на сервере не выставлены права, что на сервере админ дурак, что гороскоп не рекомендует сегодня файлы закачивать и.т.д. А надо ли оно всё ? Не проще ли тупо взять и без всяких проверок попробовать собственно сделать дело (пример сильно упрощённый) PHP: <?php // тупо сразу пробуем закачать if (move_uploaded_file($_FILES['userfile']['tmp_name'], $_FILES['userfile']['name'])) { // если закачался хорошо header('Location: ok.html'); } else { // не закачался тоже пофигу // сверяемся с $_FILES['userfile']['error'] // пишем юзеру что у него файл большой // или если ошибки юзера там нет то пишем // что админ лох напился и сайт сдох } ?> В "штатных" режимах ошибок не будет, о внештатных мы узнаем в логах. Так ли всё просто ?
:lol: иногда не проверяю на существование переменных, а сразу сравниваю их значения... хз, главное, чтоб не было фатальных ошибок.. т.е. в мозгу надо проиграть все варианты возможных ситуаций, и знать, что ничого страшного не будет
Vladson, я сейчас кстати тоже серьезно подумываю над вопросом наваять классик для обработки ошибок. По уровням там, все как полагается. Все равно полезно знать, что там за проблемы бывают у юзверей. А про ошибки я так приблизительно и делаю. Типа "бла-бла-бла, произошла ошибка сценария, но администатор портала уже получил сообщение и в ближайшее время она будет исправлена. Приносим свои извинения и просим вас перейти на главную страницу и продолжить ознакомление с нашими услугами". Хотя на самом деле я пока ничего не получаю
Mr.M.I.T., а если ошибка произошла у пользователя, а ты считал, что такая ситуация невозможна в принципе
Mr.M.I.T. правильнее, когда сайт уже посещается, блокировать отображение любых ошибок. Ты должен обработать ситуацию с ошибкой и вывести что-нить человеческое. Для чего посетителю знать что у тебя косяки с сайтом? А уже как руки доберутся открываешь лог и все узнаешь.
мы видно о разных ошибках говрим =)) короче походу тема об ошибках пхп, я почему-то подумал что о пользовательских ошибках...[/quote]
В общем, представляю на обсуждение. Замечания приветствуются PHP: <?php class error { private $log_file = "logs/log.txt"; private $user_ip = ''; private $date_time = ''; private $errors = array(); private $errors_num = 0; private $handle; function __construct() { $this->user_ip = $_SERVER['REMOTE_ADDR']; $this->date_time = date("Y.m.d H:i:s"); $this->init(); } private function init() { if (is_writable($this->log_file)) { if ($this->handle = fopen($this->log_file, 'a')) { $somecontent = " ". $this->date_time.", IP-адрес пользователя: ".$this->user_ip."\n"; if (fwrite($this->handle, $somecontent) === FALSE) {//Что-то сделать } } else {//что-то сделать } } else {//что-то сделать } } public function add($error_message, $error_level) { if (gettype($this->handle) != "resource") return; //Файл не был открыт $this->errors[$this->errors_num]['error_message'] = $error_message; $this->errors[$this->errors_num]['error_level'] = $error_level; $this->errors_num++; $somecontent = $error_level." ".$error_message."\n"; if (fwrite($this->handle, $somecontent) === FALSE) {//Что-то сделать } } function __destruct() { if (gettype($this->handle) != "resource") return; //Файл не был открыт fwrite($this->handle, "\n"); fclose($this->handle); } } ?> ЗЫ: Хотел все одним разом сделать, но почему-то в деструкторе нельзя открыть файл
Vladson инкапсуляция, исключения PHP: <? UploadedFile::Factory('userfile')->move('/new/path/to/file'); // при ошибке - exeption header('Location: ok.html'); Алсо, аспектно-ориентированное программирование
Ti Не тупи, вопрос не в том как реализовать заливку файла или как избежать ошибок, а о конкретно голом процедурном подходе в целом (без АОП/ООП/ИТД/иПЗДЦ) и о том как игнорировать (не обрабатывать) "ошибки" (не фатальные, и безопасные)
Vladson тут прослеживается явная обратная пропорциональность: чем больше ты ленишься, тем меньше успех вцелом. Конечно же есть моменты, когда "тотальную" обработку ситуаций нужно опускать. Но всё это нужно делать исходя из того, что ты желаешь получить в итоге. Можно при любой ошибке писать ее в лог и редирект на индэкс. Но это точно не самый лучший вариант. Полный контроль над твоим приложением и разумная функциональность обработки ошибок всегда будут привальирующими (черт, сложное слово). Короче надо еще подумать........
А где в приведённом случае нет контроля? Все ошибки юзера и его браузера можно увидеть в $_FILES['userfile']['error'] и спокойно показать их юзеру, это не проблема Так в чём и вопрос, а почему я должен обрабатывать ошибки если сам РНР справляется с этим даже лучше меня ?
Да, в приведенном примере php все делает сам - тут можно и не заморачиваться, а в случаях где php это показывает лучше скрывать от пользователя. Короче, если ошибка может менять тот алгоритм работы скрипта, который тебе нужен, то ее надо обрабатывать должным образом, чтобы функциональность приложения не нарушалась и ты, в случае ее возникновения, смог бы определить недостаток из логов. Если же нет, как в случае с файлом, то и ну ее нафих.