Создание исключений в PHP
В предыдущей статье мы разобрали механизм исключений в PHP. Там мы использовали уже встроенный класс Exception. Однако, мы можем создавать и свои исключения. Как это делается, Вы узнаете из этой статьи.
Создание своих исключений в PHP нужно, когда требуется обработка только определённого типа ошибок. Какие могут быть типы? Можно, например, сделать исключения для работы с базой данных или исключения для проверки правильности введённых пользователем данных, или исключения для работы с файлами. Это всё отдельные типы исключений, которые мешать в 1 класс Exception будет, мягко говоря, странно. Более того, можно не просто создать 1 класс для 1-го типа ошибок, но и вообще для каждой ошибки создать отдельный класс.
Чтобы создать исключение в PHP, нужно объявить новый класс, наследуемый от класса Exception:
<?php
/* Наш класс исключений для ошибок в работе с файлами */
class FileException extends Exception {
public function __construct($code) {
parent::__construct("", $code);
}
}
try {
$file = "file.txt";
if (!file_exists($file)) throw new FileException(1); // Если файла не существует, то выбрасываем исключение с кодом 1
if (!is_writable($file)) throw new FileException(2); // Если файл закрыт для записи, то выбрасываем исключение с кодом 2
$handler = fopen($file, "w"); // Открываем файл для записи
if (!$handler) throw new FileException(3); // Если файл не получилось открыть, то выбрасываем исключение с кодом 3
fclose($handler);
} catch (FileException $e) {
/* Обработка кода исключения и вывод соответствующих уведомлений */
if ($e->getCode() == 1) echo "Файл не найден";
elseif ($e->getCode() == 2) echo "Файл закрыт для записи";
elseif ($e->getCode() == 3) echo "Ошибка при открытии файла";
}
?>
Обратите внимание, что в catch() мы уже ждём не просто Exception, а именно FileException. Таким образом, если будет throw new Exception(), то в этот блок мы просто не попадём, так как он ждёт исключительно FileException и его дочерние классы. С другой стороны, если мы напишем в catch просто Exception, то такой catch будет перехватывать Exception и все его дочерние классы, в том числе, и FileException. Но это уже относится больше к полиморфизму, нежели к обработке исключений.
И, наконец, давайте разберём с Вами вариант, где за каждую ошибку отвечает отдельный класс:
<?php
class FileNotExistsException extends Exception {
public function __construct() {
parent::__construct("Файл не найден");
}
}
class FileNotWriteException extends Exception {
public function __construct() {
parent::__construct("Файл закрыт для записи");
}
}
class FileNotOpenException extends Exception {
public function __construct() {
parent::__construct("Ошибка при открытии файла");
}
}
try {
$file = "file.txt";
if (!file_exists($file)) throw new FileNotExistsException();
if (!is_writable($file)) throw new FileNotWriteException();
$handler = fopen($file, "w");
if (!$handler) throw new FileNotOpenException();
fclose($handler);
} catch (Exception $e) {
echo $e->getMessage();
}
?>
Код достаточно прозрачный, поэтому в комментировании не нуждается. Отмечу лишь то, что такой подход несколько более читабелен. Намного понятнее new FileNotExistsException(), чем new FileException(1). А минус данного подхода - создание огромного количества классов, что, впрочем, не так критично.
Вот таким образом можно создавать свои собственные исключения в PHP. Конечно, были разобраны далеко не все возможности, однако, я придерживаюсь принципа: рассказывать не о том, что я знаю, а о том, что я действительно использую в своей практике. А тем, кто хочет знать всё, можно посмотреть в справочнике подробнее обо всех возможностях исключений в PHP.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.