Обработка php ошибок. Часть 1.

Сегодня мы рассмотрим такой механизм PHP5, как обработка исключительных ситуаций, или просто исключений. Что такое исключение? Все начинающие кодеры рано или поздно сталкиваются с этим понятием.

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

Использование

Рассмотрим следующий код:

<?
    // открываем текстовый файл
    $f = fopen(file.txt’, ‘r’);

    if (!empty($f)) {

        echo ‘Ошибка: не удается открыть файл!;

    } else {

      // считываем строку из файла
        $str = fgets($f);

        // закрываем файл, т.к. он нам больше не нужен
        fclose($f);

        // каким-то образом обрабатываем эту строку…

      // сохраняем результат обработки в файл file2.txt
        $f = fopen(‘file2.txt’, ‘w’);

        if (!empty($f)) {

            fwrite($f, $str);
            fclose($f);

        } else {
            echo ‘Ошибка: не удается сохранить файл!;
        }

    }

    // какие-то другие действия…
?>

В приведенном примере мы два раза обработали php ошибку. Причем сделали это без всяких исключений. По такому принципу делалось в PHP до версии 5. Начиная же с версии 5 мы можем сконцентрировать обработку всех ошибок в одном месте скрипта. Это несомненно удобнее, чем обрабатывать ошибки в разных местах.

В приведенном примере очевидно, что если мы не считаем первый файл, то нет смысла обрабатывать строку, т.к. ее нет. И нет смысла сохранять файл результата обработки.

Теперь включим конструкцию try/throw/catch, которая предназначена специально для управления исключениями. И перепишем приведенную выше программу:

<?
    try {

        // открываем текстовый файл
        $f = fopen(file.txt’, ‘r’);

        if (empty($f)) {
            throw new Exception(‘не удается открыть файл!);
        }

        // в случае исключения дальнейший код
        // до конструкции catch выполнен не будет

        // считываем строку из файла
        $str = fgets($f);

        // закрываем файл, т.к. он нам больше не нужен
        fclose($f);

        // каким-то образом обрабатываем эту строку…

        // сохраняем результат обработки в файл file2.txt
        $f = fopen(‘file2.txt’, ‘w’);

        if (empty($f)) {
            throw new Exception(‘не удается сохранить файл!);
        }

        fwrite($f, $str);
        fclose($f);

    } catch (Exception $e) {

        echo 'Ошибка: '.$e->getMessage();

    }

    // какие-то другие действия…
?>

Как видим, теперь вывод php ошибки у нас находится в одном месте скрипта.

В блок try мы заключили весь код, в котором может возникнуть ошибка. Блок catch (от английского - поймать) предназначен для кода, который будет выполнен в случае возникновения исключения. Ключевое слово throw (от англ. - выбросить) предназначено для того, чтобы передать управление блоку catch.

Для передачи текста ошибки в блок обработки исключения мы использовали класс Exception:

<?
   …
   throw new Exception(‘текст ошибки’);
   …
?>

Этот текст в блоке catch мы получили благодаря методу getMessage класса Exception:

<?
    …
    catch (Exception $e) {
        echo 'Ошибка: '.$e->getMessage();
    }
    …
?>

Кроме метода getMessage, у класса Exception есть и другие. Одни из самых полезных - это методы getFile и getLine. Они позволяют увидеть имя файла и номер строки соответственно того места, где произошла ошибка.

Функция set_exception_handler

Данная функция в PHP5 предназначена для того, чтобы установить обработчик исключений по-умолчанию. Т.е. такой обработчик, который вызовется при возникновении исключения, которое ни одним участком кода не поймалось (не попало ни в один блок catch).

Пример:

<?
    function exc_handler($exc) {
        echo ‘Необработанное исключение:.$exc->getMessage();
    }

    set_exception_handler('exc_handler');

    throw new Exception('мое исключение');

    echo "Эта строка никогда не выведется";
?>

Достоинства и недостатки

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

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

Основной недостаток исключений — в их невысокой скорости. В местах программы, критичных по скорости, не стоит возбуждать и обрабатывать исключения.

Резюме

Данной статьей я не пытался рассмотреть все возможности обработки исключений в PHP, а показал лишь самые основные и наиболее часто используемые. Я не рассмотрел возможность расширения класса Exception (возможность написания собственных классов на основе Exception), не рассмотрел все методы этого класса. Также я не рассмотрел разматывание стека функций при многоуровневой обработке исключений. Всего этого я не делал, чтобы не напугать вас лишней на данном этапе освоения PHP информацией :) Всему свое время! До встречи!





Читайте также:



3 Ответов на “Обработка php ошибок. Часть 1.”

  1. У автора очень приятный слог :) Хотим еще инфы по этой теме!

  2. novice

    Уже есть вторая часть этой статьи. :)
    Можете найти ее здесь:
    https://i-novice.net/obrabotka-php-oshibok-chast-2/

  3. $f = fopen(‘file.txt’, ‘r’);
    if (!empty($f)) {

    тут отрицание не нужно


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map