Исключения
Исключения
Модель исключений PHP напоминает модель исключений других языков программирования. PHP умеет выбрасывать — throw — и ловить — catch — исключения. Код заключают в блок try, чтобы упростить обработку вероятных исключений. Каждому блоку try указывают как минимум один блок catch или finally
Исключение будет «всплывать» по стеку вызовов функций, пока не найдёт блок catch, если функция выбросила исключение, а в текущей области видимости функции, которая её вызвала, нет блока catch. PHP выполнит каждый блок finally, который встретит по пути. Программа завершается фатальной ошибкой, когда стек вызовов не встречает блок catch и разворачивается до глобальной области видимости, если разработчик не установил глобальный обработчик исключений
В коде допустимо выбрасывать только объект исключения, тип которого при проверке оператором instanceof соответствует интерфейсу Throwable. Попытка выбросить объект, который не выполняет это условие, приведёт к фатальной ошибке PHP
Try
В блок try помещается код, который потенциально может вызвать исключение.
Если в блоке try при выполнении кода возникает ошибка, то блок try прекращает выполнение и передает управление блоку catch
После завершения выполнения кода в блоке catch программа продолжает выполнять инструкции, которые размещены после блока catch.
Если в блоке try при выполнении кода не возникает ошибок, блок catch не выполняется, программа продолжает выполнять инструкции, которые размещены после блока catch.
Catch
Тип исключения, который мы хотим обработать, указывается в круглых скобках после оператора catch
catch(Тип_исключения $ex)
В данном случае $ex, будет хранить информацию об исключении и которую мы можем использовать при обработке исключения.
Блок catch определяет, как реагировать на исключение, которое выбросил код.
Блоки catch записывают один за другим, чтобы перехватывать исключения разных классов.
Внутри блока catch допустимо выбрасывать, а точнее — повторно выбрасывать исключения через ключевое слово throw.
PHP продолжит выполнение кода после блока catch, который сработал, если внутри блока не выбросили исключение
При появлении исключения PHP не выполнит код, который идёт за инструкцией, а попытается найти первый подходящий блок catch.
Finally
Блок finally также допустимо указывать после или вместо блоков catch. PHP выполнит код в блоке finally после блоков try и catch, независимо от того, выбросил ли код исключение, и до возобновления нормального выполнения
Глобальный обработчик исключений
Функция set_exception_handler() устанавливает callback-функцию, которую PHP вызовет вместо блока catch, если в коде не вызвали другие блоки. Эффект по существу такой же, как если бы всю программу обернули в блок try-catch с этой функцией в качестве catch.
Типы ошибок и исключений
В PHP для разных ситуаций есть множество типов, которые описывают ошибки. Все эти встроенные типы применяют интерфейс Throwable
Все типы делятся на две группы: собственно ошибки (класс Error) и собственно исключения (класс Exception).
А от классов Error и Exception наследуются классы ошибок и исключений, которые описывают конкретные ситуации.
Например, от класса Error наследуется класс ArithmeticError, который описывает ошибки, возникающие при выполнении арифметических операций. А от класса ArithmeticError наследуется класс DivisionByZeroError, который представляют ошибку при делении на ноль.
Блоки catch с более конкретными типами ошибок и исключений должны идти в начале, а более с более общими типа - в конце
Конструкция try..catch позволяет определить несколько блоков catch - для обработки различных типов ошибок и исключений:
try
{
$result = 5 / 0;
echo $result;
}
catch(DivisionByZeroError $ex)
{
echo "На ноль делить нельзя";
}
catch(ArithmeticError $ex)
{
echo "Ошибка при выполнении арифметической операции";
}
catch(Error $ex)
{
echo "Произошла ошибка";
}
catch(Throwable $ex)
{
echo "Ошибка при выполнении программы";
}
При возникновении ошибки будет для ее обработки будет выбираться тот блок catch, который соответствует вошникшей ошибки. Так, в данном случае при делении на ноль будет выполняться второй блок catch.
Если бы в блоке try возникла бы ошибка, которая бы не соответствовала типам из блоков catch (в данном случае - типам DivisionByZeroError и ParseError), то такая ошибка не была бы обработана, и соответственно программа бы аварийно завершила свое выполнение.
Тип Throwable представляет наиболее общий тип, так как ему соответствуют все возможные ошибки и исключения, поэтому блоки catch с таким типом должны идти в конце.
Если нам надо обрабатывать в принципе все ошибки и исключения, то мы можем определить только обработку общего для всех них типа Throwable:
try
{
$result = 5 / 0;
echo $result;
}
catch(Throwable $ex)
{
echo "Ошибка при выполнении программы";
}
Источник: https://metanit.com/php/tutorial/8.1.php
Получение информации об ошибках и исключениях
Интерфейс Throwable предоставляет ряд методов, которые позволяют получить некоторую информацию о возникшем исключении:
getMessage(): возвращает сообщение об ошибке
getCode(): возвращает код исключения
getFile(): возвращает название файла, в котором возникла ошибка
getLine(): возвращает номер строки, в которой возникла ошибка
getTrace(): возвращает трассировку стека
getTraceAsString(): возвращает трассировку стека в виде строки
try
{
$result = 5 / 0;
echo $result;
}
catch(DivisionByZeroError $ex)
{
echo "Сообщение об ошибке: " . $ex->getMessage() . "
";
echo "Файл: " . $ex->getFile() . "
";
echo "Номер строки: " . $ex->getLine() . "
";
}
Источник: https://metanit.com/php/tutorial/8.1.php






