PHP имеет модель исключений, аналогичную другим языкам программирования. Исключение может быть throw
n и перехвачено (" catch
ed") внутри 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
блока, определенного в последовательности. Исключения могут быть throw
n (или повторно сгенерированы) внутри 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();
}
?>
0 комментариев