Обработка 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 информацией Всему свое время! До встречи!
У автора очень приятный слог Хотим еще инфы по этой теме!
Уже есть вторая часть этой статьи.
Можете найти ее здесь:
https://i-novice.net/obrabotka-php-oshibok-chast-2/
$f = fopen(‘file.txt’, ‘r’);
if (!empty($f)) {
тут отрицание не нужно