Как грамотно обрабатывать ошибки в конструкторах? PHP
Допустим есть класс, который в конструкторе принимает массив и что-то делает с его элементами. Предположим, что элементы должны соответствовать какому-либо условию. Как правильно обработать случай, когда элемент не соответствует? Пользователь же должен как-то узнать об ошибке?
До этого изучал С++ и оттуда знаю, что бросать исключения в конструкторе - очень плохая идея. Относится ли это к PHP, а если да, то как уведомлять пользователей об ошибках в конструкторе?
Ответы (1 шт):
Аналогичный пример вашей проблемы
Предположим что у нас есть класс DataBaseConnection и для его работы нам необходим класс DataBaseConfiguration.
DataBaseConfiguration - используем для хранения настроек:
class DataBaseConfiguration{
private $url;
private $userName;
private $password;
//Другие поля и Setterы и Getterы
}
DataBaseConnection - компонент системы, который инициализирует соединение с базой данных
class DataBaseConnection
{
/**
* Создание компонента для работы с БД
*
* @param DataBaseConfiguration $configuration
*
* @throws Exception\DataBaseConnectionException
*/
public function __construct(DataBaseConfiguration $configuration)
{
$this->initializeConnection($configuration);
}
/**
* @param DataBaseConfiguration $configuration
*
* @throws Exception\DataBaseConnectionException
*/
private function initializeConnection(DataBaseConfiguration $configuration)
{
try {
//Как-то создаем подключение
} catch (PDOException $e) {
throw new Exception\DataBaseConnectionException("Can't initialize connection {$e->getMessage()}");
}
}
}
Как вы можете предположить, соединение с БД операция, которая не всегда выполнима, что означает в случае возникновения такой проблемы у вас получится не рабочий компонент системы.
Добавления Exception в конструктор класса, вы выдаете контракт использования пользователю данного компонента, на то что класс:
- Либо создается и работает корректно
- Либо не создается вообще и бросается
Exception
Ваша проблема
Так и с вашим классом, нет смысла в компоненте, который не работает :)
Создавая Exception:
- Вы спасаете себя от дальнейших проблем
- Создаете контракт использования
- Даете пользователю компонента контроль над происходящим.
Дополнения
- Используйте PHPDoc's с аннотацией
@throws - Возможно вашему "массиву" необходима структура данных, но не факт :)