Для обработки нефатальных ошибок, в РНР имеется инструмент, называемый перехватом ошибок. Метод заключается в том, что в программе пишется специальная функция — обработчик ошибки, которая вызывается РНР всякий раз, когда наступает та или иная ошибочная ситуация..
<?php ## Перехват ошибок и предупреждений.
// Определяем новую функцию-обработчик.
function myErrorHandler($errno, $msg, $file, $line) {
echo "Произошла ошибка с кодом <b>$errno</b>!<br>";
echo "Файл: <tt>$file</tt>, строка $line.<br>";
echo "Текст ошибки: <i>$msg</i>";
echo "</div>";
}
// Регистрируем ее для всех типов ошибок.
set_error_handler("myErrorHandler", E_ALL);
// Вызываем функцию для несуществующего файла, чтобы
// сгенерировать предупреждение, которое будет перехвачено,
filemtime ("spoon") ;
?>
При нефатальных ошибках, программа всегда продолжает свою работу — просто в момент возникновения ошибочной ситуации вызывается функция-обработчик, а затем выполнение идет дальше.
Серьезные ошибки в общем случае невозможно обработать с использованием set_error_handler(), потому что в каждом конкретном случае необходимо писать "персональный" код восстановления.
В случае возникновения серьезной ошибки программа просто завершает работу по exit() или die(). Конечно, такой метод совершенно неприемлем в коде различных библиотек общего пользования: ведь вызывающая программа может не ожидать, что ее выполнение может вот так быть прервано из-за какой-нибудь мелочи вроде невозможности открытия файла журнала.
Практически все стандартные функции РНР в случае возникновения ошибочной ситуации возвращают false или null, а также вызывают trigger_error() для фиксирования диагностического сообщения. Например, функция fopen() при невозможности открытия файла возвращает false, и мы должны проверить результат на истинность.
Исключения (exceptions) — это технология, позволяющая писать код восстановления после серьезной ошибки в удобном для программиста виде. С применением исключений перехват и обработка ошибок значительно упрощается.
Исключения также позволяют удобно передавать информацию о возникшей ошибке вниз по дереву (стеку) вызовов функций. Таким образом, код восстановления может находиться даже не в текущей процедуре, а в той, что ее вызывает.
Исключение — это некоторое сообщение об ошибке. При своей генерации оно автоматически передается в обработчик исключения. Любое исключение в программе представляет собой объект некоторого класса, создаваемый, как обычно, оператором new. Этот объект может содержать различную информацию, например, текст диагностического сообщения, а также номер строки и имя файла, в которых произошла генерация исключения. Допустимо добавлять и любые другие параметры.
Для работы с исключениями используют конструкции try...catch.
Код обработчика исключения помещается в блок инструкции catch(Exception $e). Аргумент блока catch определяет, в какую переменную должен быть записан перехваченный объект-исключение перед запуском кода обработчика. Также обязательно задается тип исключения — имя класса. Обработчик будет вызван только для тех объектов-исключений, которые совместимы с указанным типом (например, для объектов данного типа).
В блоке tryразмещается код, который может сгенерировать исключение. Любые исключения, сгенерированные внутри него (и только они), будут переданы соответствующему обработчику.
Инструкция throwиспользуется для генерации исключения. Генерацию также называют возбуждением или даже выбрасыванием исключения. Инструкция throw не просто генерирует объект-исключение и передает его обработчику блока catch. Она также немедленно завершает работу текущего try-блока. Любое исключение представляет собой обычный объект РНР, который мы и создаем в операторе new.