Когда критическая ошибка приносит радость…

    Прочитав недавно на пьяную голову «Обработка ошибок и исключений в PHP», решил применить полученные знания на практике. Честно, ещё 6 часов назад не знал, куда это меня приведёт, но в итоге теперь мои скрипты при ошибка зажигают вот такой симпотный экран:




    Если честно, то PHP тут как такового немного. Создаём свой собственный подкласс Exception; с помощью set_error_handler приказываем PHP кидать наше новое исключение всякий раз, когда возникает ошибка или предупреждение; и оборачиваем весь наш код в try { … } catch () { … }. Короче говоря, всё как в вышеупомянутой статье. Большую часть времени, я потратил на стили форматирования и картинки (которые, к слову, вставляются с помощью url-data; т.е. класс мой получился независимым от внешних ресурсов).

    «Код-то где, балаболка?»



    Весь необходимый код сосредоточен в одном файле, являющимся частью фреймворка будущего (NB! …в зачаточном состоянии ;-) ). Прежде чем inсlude-ить этот файл в свой проект, нужно выполнить с ним следующие операции:

    1. Избавится от «глушилки» в первой строке;
    2. Все упоминания Aero()->get_option(...) заменить вторым параметром вызываемого метода. (Например Aero()->get_option('catch_errors', E_ALL, 'error_handler') превращается просто в E_ALL.)

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 43

      0
      Напоминает страницу ошибок в ASP. Тока здесь куда притней глазу.
        –1
        В ASP.net это кастомизируется не в пример легче. И выдача ошибок только локальному клиенту делается одной строчкой ;)
          +2
          вывод ошибок - не главная задача веб-технологий. против ASP я, конечно, ни чего против не имею
            0
            два раза "против" :-[
            да, я дурак(
              0
              Ну, это так было, чисто в ответ на "приятней глазу" — для более корректного сравнения возможностей платформ.
            0
            Согласен, приятней, но что-то не заметил на скриншоте стек трейса, а чтука очень полезная.
            0
            На скриншоте все пароли и пассы наружу - раздолье для весёлых хацкеров.
              +1
              Backtrace выдаётся только на машине с IP=127.0.0.1
              Усё предусмотрено. ^_^
                0
                Ну тогда ништяк ;)
                  +1
                  а вы знаете, что на некоторых хостингах REMOTE_ADDR всегда содержит 127.0.0.1? говорю как человек, который их видел ну очень много.
                    0
                    дауж, подтверждаю, так как встречался и не раз!
                      0
                      Ну ладно вам, ладно… Не всё же с первого раза должно получаться :-) Как вам такой вариант: $_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR']?
                        +1
                        В большинстве современных нормальных фреймворках существует такое понятие, как environment. В отличие от development environment, в production environment никаких ошибок не должно отображаться в принципе, кому бы то ни было, а писать надо всё в логи.
                          0
                          не, серьезно. на REMOTE_ADDR завязываться не стоит. приведу пример: у нас apache на заднем конце, а nginx на переднем. допустим, кое-что забыли подкрутить и ip клиента всегда будет равен ip сервера. т.е. в конечном счете SERVER_ADDR == REMOTE_ADDR. вот такое вот бывает.
                          есть еще разные варианты. например, если у вас сервис типа http://translate.google.ru/translate_t?h…. запрашиваем в нем самого себя и опять таки SERVER_ADDR == REMOTE_ADDR. etc.
                            0
                            Короче, крутите тогда сами… ;-) Вообще в оригинальной версии класса $_SERVER['SERVER_ADDR'] == $_SERVER['REMOTE_ADDR'] определяет показывать ли backtrace, если других инструкций не дано (считывается переменная окружения Aero()->get_option('show_backtrace', $is_localhost, 'error_handler'); если она выставлена в false ничего выводиться не будет). Я не даром упомянул MIT: делайте, что хотите, но меня не вините…
                            0
                            Никак.
                            getenv - как.
                        0
                        Если на сайте есть разделение прав, то луше показывать администратору, а для гостей логировать.
                          0
                          а если ошибка возникает только у гостей? ;)
                          +2
                          блин, это же мой айпишник!
                          0
                          так нефиг для кого не попало лог показывать
                          0
                          Молодец нужное для себя дело сделал, а вот как их оформлять это уже дело персонально каждого программиста.
                          Почитай так же про FirePHP, сейчас ею пользуюсь вовсю
                            0
                            Это отдельный класс AeroLogger уже в разработке. Вместе с профайлером и "консолью" для остальных браузеров.
                            0
                            Красиво сделано. Спасибо.
                              +1
                              А у меня больше на BSOD похоже
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  Лучше, конечно, никогда (даже такие) сообщения об ошибках не видеть :)

                                  Спасибо за оригинальный код и его лицензию!

                                  // Плюс топику и карме.
                                    0
                                    >Прочитав недавно на пьяную голову «Обработка ошибок и исключений в PHP»
                                    Вот эта фраза, мне кажеться, заслуживает внимания.
                                      +1
                                      «Код-то где, балаболка?» - вобще класс!!!
                                        +1
                                        > Код релизится под MIT-лицензией.
                                        Лол :)
                                        • НЛО прилетело и опубликовало эту надпись здесь
                                            +1
                                            Update: Немного отрезвев от пятничного пива, я задумался… А нафигом мне тут исключения? 0_o

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

                                            <?
                                            error_reporting
                                            (E_ALL);

                                            function 
                                            a() {
                                                echo 
                                            "This is function A<br />";
                                                
                                            trigger_error('<b>Error!!!!!!!!!!!!!!!!!!!</br /></b>');
                                                
                                            b();
                                            }

                                            function 
                                            b() {
                                                echo 
                                            "This is function B<br />";
                                            }

                                            function 
                                            err($code$msg ''$file ''$line 0) {
                                                echo 
                                            "This is error: ".$msg;
                                            }

                                            set_error_handler('err'E_ALL);
                                            a();
                                            ?>

                                            В этой ситуации при возникновении ошибки (точнее сигнале со стороны вашего приложения об ошибке) код продолжит выполняться и скрипт выведет на экран:

                                            This is function A
                                            This is error: Error!!!!!!!!!!!!!!!!!!!
                                            This is function B

                                            Если генерировать Exception, то до строки с вызовом b() интерпретатор не дойдет. Как поступать, решать каждому в отдельности.

                                            И тут моя позиция такова: для notice показываем ваши красивости, но выполнение продолжаем, а для warning - красивости и останов приложения.
                                              0
                                              Я после генерации критической ошибки тупо давлю exit(). ;-) Вместо exit(), можно кинуть какое-нибудь исключение, если нужно корректно убить все объекты, вызывая деструкторы. IMHO дело вкусу. Лично я на деструкторы стараюсь не полагаться.
                                              –1
                                              В django тоже красиво очень, а в django-book так и написано "надеюсь вам понравятся наши постельные тона" :-)
                                                0
                                                Наверное меня щас заминусуют, но... нафига? :) Хороший код должен работать без ошибок и исключений в продакшне. Т.е. фактически, ни перехват, ни оформление не нужны :)
                                                  +1
                                                  ну то, что сделал автор — некий фетиш :)
                                                  а вообще какой-бы ты не был крутой программер — ошибки все-равно будут
                                                  0
                                                  Зачем пугать пользователей вот такими дампами?
                                                  … все должно быть тихо мирно и, главное, недоступно для левых глаз
                                                    –7
                                                    почти как в rails из коробки ;)
                                                      0
                                                      Rails — framework. Тут же предлагается standalone-решение.
                                                      0
                                                      И почему ребята из PHP сами такого не сделали?
                                                        0
                                                        Интересно, а как раньше вы дебагали свои творения? :)
                                                          0
                                                          О проектах с такими вложениями в народе будут говорить: «сайт говно, но какие ошибки выдает, залюбуешься» :)
                                                            0
                                                            А зеркала не осталось?
                                                            Только руки дошли, захотелось попробовать, а тут такое вот дело.
                                                            Сейчас ссылка недоступна.

                                                          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                          Самое читаемое