Модель исключений (exceptions) в PHP похожа с используемыми в других языках программирования.
try
Исключение можно сгенерировать (выбросить) при помощи оператора throw, и можно перехватить (поймать) оператором catch. Код генерирующий исключение, должен быть окружен блоком try, для того, чтобы можно было перехватить исключение. Каждый блок try должен иметь как минимум один соответствующий ему блок catch или finally.
Генерируемый объект должен принадлежать классу Exception или наследоваться от Exception. Попытка сгенерировать исключение другого класса приведет к фатальной ошибке PHP.
catch
Можно использовать несколько блоков catch, перехватывающих различные классы исключений. Нормальное выполнение (когда не генерируются исключения в блоках try) будет продолжено за последним блоком catch. Исключения могут быть сгенерированы (или вызваны еще раз) оператором throw внутри блока catch.
При генерации исключения код, следующий после описываемого выражения, не будет выполнен, а PHP попытается найти первый блок catch, перехватывающий исключение данного класса. Если исключение не будет перехвачено, PHP выдаст фатальную ошибку: "Uncaught Exception ..." (Неперехваченное исключение), если не был определен обработчик ошибок при помощи функции set_exception_handler().
В PHP 7.1 и выше, блок catch может принимать несколько типов исключений с помощью символа (|). Это полезно, когда разные исключения из разных иерархий классов обрабатываются одинаково.
finnaly
В PHP 5.5 и более поздних версиях блок finally также можно использовать после или вместо блока catch. Код в блоке finally всегда будет выполняться после кода в блоках try и catch, независимо от того, было ли выброшено исключение, перед тем как продолжится нормальное выполнение кода.
Стандартная библиотека PHP (SPL) предоставляет хороший набор встроенных классов исключений.
function inverse($x) { if (!$x) { throw new Exception('Деление на ноль.'); } return 1/$x; } try { echo inverse(5) . "\n"; echo inverse(0) . "\n"; } catch (Exception $e) { echo 'Выброшено исключение: ', $e->getMessage(), "\n"; } // Продолжение выполнения echo "Привет, мир\n";
Вложенные исключения.
function inverse($x) { if (!$x) { throw new Exception('Деление на ноль.'); } return 1/$x; } try { echo inverse(5) . "\n"; } catch (Exception $e) { echo 'Поймано исключение: ', $e->getMessage(), "\n"; } finally { echo "Первый блок finally.\n"; } try { echo inverse(0) . "\n"; } catch (Exception $e) { echo 'Поймано исключение: ', $e->getMessage(), "\n"; } finally { echo "Второй блок finally.\n"; } // Продолжение нормального выполнения echo "Привет, мир\n";