PHP имеет модель исключений, аналогичную другим языкам программирования. Исключение может быть thrown и перехвачено (" catched") внутри PHP. Код может быть заключен в tryблок, чтобы упростить перехват потенциальных исключений. Каждый tryдолжен иметь хотя бы один соответствующий catchили finallyблок.

Если возникает исключение, а его текущая область действия функции не имеет catch блока, исключение будет «всплывать» стек вызовов к вызывающей функции, пока не найдет соответствующий catchблок. Все finallyблоки, которые он встретит на своем пути, будут выполнены. Если стек вызовов раскручивается до глобальной области видимости, не встречая соответствующего catchблока, программа завершится с фатальной ошибкой, если не установлен глобальный обработчик исключений.

Брошенный объект должен быть экземпляром класса Exception или подклассом Exception. Попытка бросить объект, который не является фатальной ошибкой PHP.

Начиная с PHP 8.0.0, throwключевое слово является выражением и может использоваться в любом контексте выражения. В предыдущих версиях это был оператор, и он должен был располагаться на отдельной строке.

catch

Блок catchопределяет, как реагировать на выброшенное исключение. Блок catch определяет один или несколько типов исключений или ошибок, которые он может обрабатывать, и, необязательно, переменную, которой можно присвоить исключение. (Эта переменная требовалась до PHP 8.0.0.) Первый catchблок, с которым сталкивается выброшенное исключение или ошибка, который соответствует типу выброшенного объекта, будет обрабатывать объект.

catchМожно использовать несколько блоков для перехвата различных классов исключений. Нормальное выполнение (когда в блоке не генерируется исключение try ) будет продолжаться после этого последнего catchблока, определенного в последовательности. Исключения могут быть thrown (или повторно сгенерированы) внутри catchблока. Если нет, выполнение продолжится после catchблока, который был запущен.

Когда возникает исключение, код, следующий за оператором, не будет выполняться, и PHP попытается найти первый соответствующий catchблок. Если исключение не перехвачено, фатальная ошибка PHP будет выдана с сообщением " Uncaught Exception ...", если обработчик не был определен с помощью set_exception_handler() .

Начиная с PHP 7.1.0, catchблок может указывать несколько исключений с помощью вертикальной |черты ( ). Это полезно, когда разные исключения из разных иерархий классов обрабатываются одинаково.

Начиная с PHP 8.0.0, имя переменной для перехваченного исключения является необязательным. Если не указано, catchблок все равно будет выполняться, но не будет иметь доступа к брошенному объекту.

finally

Блок finallyтакже может быть указан после catchблоков или вместо них. Код внутри finallyблока всегда будет выполняться после блоков tryи catch, независимо от того, было ли выброшено исключение, и до возобновления нормального выполнения.

Одно заметное взаимодействие происходит между finallyблоком и returnоператором. Если returnоператор встречается внутри блоков tryили , блок все равно будет выполняться. Более того, оператор оценивается при встрече, но результат будет возвращен после выполнения блока.

Global exception handler

Если исключению разрешено подниматься до глобальной области, оно может быть перехвачено глобальным обработчиком исключений, если он установлен. Функция set_exception_handler() может установить функцию, которая будет вызываться вместо catchблока, если никакой другой блок не вызывается. Эффект, по сути, такой же, как если бы вся программа была заключена в try-блок catchс этой функцией в качестве файла catch.

Примечания 

Примечание :

Внутренние функции PHP в основном используют отчеты об ошибках , только современные объектно-ориентированные расширения используют исключения. Однако ошибки можно легко преобразовать в исключения с помощью ErrorException . Однако этот метод работает только с нефатальными ошибками.

Пример #3 Преобразование отчетов об ошибках в исключения

 

 

Стандартная библиотека PHP (SPL) предоставляет большое количество встроенных исключений.

Примеры

Пример #4 Генерация исключения

getMessage(), "\n";
}

// Continue execution
echo "Hello World\n";
?>

Приведенный выше пример выведет:

0,2 Пойманное исключение: деление на ноль. Привет, мир

Пример #5 Обработка исключений с помощью finallyблока

getMessage(), "\n";
} finally {
    echo "First finally.\n";
}

try {
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "Second finally.\n";
}

// Continue execution
echo "Hello World\n";
?>

Приведенный выше пример выведет:

0,2
Сначала наконец.
Пойманное исключение: деление на ноль.
Второй наконец.
Привет, мир

Пример #6 Взаимодействие между finallyблоком иreturn

 

 

Пример #7 Вложенное исключение

getMessage());
        }
    }
}

$foo = new Test;
$foo->testing();

?>

Приведенный выше пример выведет:

строка(4) "фу!"

Пример #8 Обработка исключений Multi catch

testing();

?>

Приведенный выше пример выведет:

строка (11) "MyException"

Пример #9 Пропуск перехваченной переменной

Разрешено только в PHP 8.0.0 и более поздних версиях.

 

Пример #10 Выброс как выражение

Разрешено только в PHP 8.0.0 и более поздних версиях.

getMessage();
}
?>