Try, Catch, Finally
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 68 из 91.
Теперь, когда ты знаешь, как создавать и выбрасывать исключения, тебе нужно научиться их catch. Структура try-catch-finally позволяет корректно обрабатывать исключения, вместо того чтобы позволить им привести к сбою приложения.
Поместите код, который может вызвать исключение, в блок try, затем обработайте исключение в блоке catch:
<?php
class Calculator {
public function divide(int $a, int $b): float {
if ($b === 0) {
throw new InvalidArgumentException("Cannot divide by zero");
}
return $a / $b;
}
}
$calc = new Calculator();
try {
echo $calc->divide(10, 0);
} catch (InvalidArgumentException $e) {
echo "Error: " . $e->getMessage();
}
Вывод:
Error: Cannot divide by zeroВы можете обрабатывать разные типы исключений с помощью нескольких блоков catch. PHP проверяет их по порядку, поэтому размещайте более специфичные исключения первыми:
<?php
try {
// рискованный код
} catch (InvalidArgumentException $e) {
echo "Bad input: " . $e->getMessage();
} catch (Exception $e) {
echo "Something went wrong: " . $e->getMessage();
}
Блок finally выполняется независимо от того, было ли выброшено или перехвачено исключение. Он идеально подходит для задач cleanup, таких как закрытие соединений:
<?php
try {
echo "Attempting operation\n";
throw new Exception("Failed");
} catch (Exception $e) {
echo "Caught: " . $e->getMessage() . "\n";
} finally {
echo "Cleanup complete";
}
Вывод:
Attempting operation
Caught: Failed
Cleanup completeБлок finally выполняется, даже если вы возвращаете значение из блоков try или catch, что делает его надёжным для важных операций cleanup.
Задание
ЛегкоДавайте создадим систему обработки file, которая демонстрирует, как try-catch-finally совместно обрабатывает errors, гарантируя, что очистка always выполняется.
Вы организуете код в трёх files:
FileException.php: Create пользовательский классFileException, который extendsException. Он будет представлять ошибки, связанные с file, в вашей системе.FileProcessor.php: Create классFileProcessor, имитирующий операции с file. Подключите file FileException. В вашем классе должны быть:- Приватное свойство типа boolean
$isOpen, initialized значениемfalse - Метод
open(string $filename): void, который устанавливает$isOpenв значениеtrueи выводит"Opening: [filename]". Если имя file равно"invalid.txt", выбросьтеFileExceptionс сообщением"Cannot open file" - Метод
process(): void, который выводит"Processing file...". Если$isOpenравноfalse, выбросьтеRuntimeExceptionс сообщением"File not open" - Метод
close(): void, который устанавливает$isOpenв значениеfalseи выводит"File closed" - Метод
isOpen(): bool, который возвращает current состояние
- Приватное свойство типа boolean
main.php: Подключите file FileProcessor. Вы получите один input: имя file.Create объект
FileProcessorи используйте структуруtry-catch-finally, чтобы:- В блоке
try: вызовитеopen()с именем file, затем вызовитеprocess() - Сначала Catch
FileExceptionи выведите"File error: [message]" - Catch
RuntimeExceptionи выведите"Runtime error: [message]" - В блоке
finally: проверьте, открыт ли file, используяisOpen(), и, если да, вызовитеclose(). Затем выведите"Cleanup complete"
- В блоке
Блок finally гарантирует, что очистка произойдёт независимо от того, завершатся ли операции успешно или завершатся с ошибкой. Этот шаблон необходим для управления такими ресурсами, как files, подключения к базам данных или сетевые сокеты, где очистка должна выполняться независимо от происходящего во время обработки.
Попробуйте сами
<?php
require_once 'FileProcessor.php';
// Прочитать ввод
$filename = trim(fgets(STDIN));
// TODO: Создать экземпляр FileProcessor
// TODO: Использовать структуру try-catch-finally:
// - В блоке try: вызвать open() с filename, затем вызвать process()
// - Сначала перехватить FileException и вывести "File error: [message]"
// - Перехватить RuntimeException и вывести "Runtime error: [message]"
// - В блоке finally: проверить, открыт ли файл с помощью isOpen(), если да, вызвать close()
// Then print "Cleanup complete"
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Повторение — простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыПовторение — иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateМодификаторы доступа подробноГеттеры и сеттерыСокрытие информацииПродвижение конструктора (8.0)Повторение — система учёта студентов2Пространства имён и автозагрузка
Введение в пространства имёнКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerПовторение — структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс и абстрактный классАннотация типов с интерфейсамиПовторение — калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeПовторение — пользовательская коллекция11Система типов и обработка ошибок
Объявления типовNullable-типыОбъединение и пересечение типовКлассы исключенийПользовательская иерархия исключенийTry, Catch, FinallyПовторение — валидатор формы3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищённые свойстваСвойства только для чтения (PHP 8.1)Повторение — менеджер банковского счёта6Полиморфизм
Повторение переопределения методовПолиморфизм через интерфейсыАннотации типов и объединённые типыПозднее статическое связываниеПовторение — обработчик платежей9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования, часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн StrategyПотренируйтесь самостоятельно: Онлайн-компилятор PHP