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

error Обработка 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 информацией icon smile Обработка php ошибок. Часть 1. Всему свое время! До встречи!





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



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

  1. Numlock
    Июль 17th, 2008

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

  2. novice
    Июль 17th, 2008

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

  3. Денис Каратаев
    Сентябрь 3rd, 2010

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

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

Оставить комментарий


© 2008 - 2012 i-novice.net | Все права защищены.