1. PHP / Говнокод #6642

    +162

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    class db {
        //...
        function query($sql) {
            //...
            if ($error_no) {
                display_error($error_no, $error_msg, $sql);
                throw new Exception('Error in query');
                return FALSE;
            }
            return $result;
        }
    
        function display_error($error_no, $error_msg, $sql) {
            //...
            exit;
        }
    
    }

    А я думай, какого ___ оно не перехватывается:).

    Запостил: Lowezar, 12 Мая 2011

    Комментарии (15) RSS

    • не перехватывается, и страница на половине обрывается )
      Ответить
    • Показал ошибку - заканчивай работу.
      Ответить
      • но не так же резко. надо еще показать в красивом виде, убрать за собой
        Ответить
    • А что, в PHP можно обработать ошибку и вернуться по стеку туда, откуда ее бросили? Я чет такой возможности за ним не припомню...
      Ответить
      • а зачем это надо?
        Ответить
        • В данном примере это нужно для того, чтобы вернуть FALSE :) А вообще - так в Лиспе исключения работают. Т.е. когда исключение подымается по стеку вызовов, и попадает в соответсвующий ему обработчик, то если обработка была успешной, выполнение может вернуться туда, где прервалось. Типичная ситуация: парсите XML и попадается одиноко соящий амперсанд. Парсер бросает ошибку, (как правило она будет всплывать через несколько методов) и попадет в обработчик исключений. В Яве, в таком случае уже скорее всего все будет потеряно, и структура, которую уже успели распарсить до этого и даже позиция в потоке, да и сам поток уже возможно закрыт. Т.е. остается только сообщить пользователю о том, что XML плохо сформирован. В Лиспе можно вернуться на место, выяснить, в чем была неполадка и отреагировать, например, удалить амперсанд и продолжить парсить дальше, или удалить весь узел, или экранировать ампресанд и т.д.
          Ответить
          • мда. даже в вижлбейсике, как бы он плох ни был, была такая фишка, как On Error Resume [Next]
            Ответить
            • Это с олдового бейсика пошло. Тот умел всякие изьёбства, типа LIST, разнотиповых переменных с одним именем и в том же духе.
              Ответить
      • Нет, туда невозможно вернуться, и вообще этот throw там как бы бесполезен, потому что display_error прерывает вообще выполнение скрипта полностью. А я надеялся запихнуть query в try/catch, записать ошибку в лог, читать мыльник дальше... И размышлял почему не удаётся обработать эту ошибку, искал в других местах: думал может ещё где такой запрос выполняется без try... 8-D
        Ответить
      • Эксепшены кэтчить конечно же можно, но exit есть exit
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий