Когда выбрасывать исключение, а когда возвращать объект результата (с ошибкой)?
Часто в методы классов должны вернуть информацию об успешной операции.
Например, добавление товара в корзину, addProduct2Basket(int $productId, int $quantity = 1) - при успешном добавлении, достаточно получить булево значение - true.Я
А если товара нет в каталоге ? Выбрасывать исключение ? Потом его перехватывать и обрабатывать.. ?
Хочется также, чтобы метод вернул ошибку, например для записи в лог.
Чтобы метод не возвращал разные типы данных, с начало булево, потом строка ошибки..
Наверное, хорошо бы завести класс Result, который имеет метод success() и getErrorMessages(), который возвращает инфу об ошибке при success() === false.
Как все таки лучше делать ? Какие есть варианты ? Стоит ли часто использовать для разных методов такой подход - возвращения объекта результата ?
Ответы (1 шт):
Для начала разберемся в определениях:
Ошибки (ErrorException) - это ситуации, которые невозможно обработать, их выбрасывает сам php если не может совершить операцию. Вы не должны выбрасывать их из кода. Все что вы можете сделать при обработке такой ситуации - показать пользователю страницу с извинениями, сделать запись в лог и отправить сообщение на почту с сообщением об ошибке.
Исключения (Exceptions) - это способы управления потоком вашего приложения: т.е. если вы делаете валидацию чего либо и нашли ошибку в данных, то смело можно выбрасывать ValidationException.
Аналогично, на вашем примере, в случае если вы не нашли товар в каталоге, то можно выкинуть NotFoundException c кодом 404. Реализовать такое можно таким образом:
class NotFoundException extends \Exception
{
public function __construct($message = "Not found", $code = 404)
{
parent::__construct($message, $code);
}
}
При желании можно передавать кастомное сообщение прямо при вызове исключения, чтобы указать на конкретную ошибку:
throw new NotFoundException('Item not found');
Так же, если вы хотите обрабатывать ошибки/исключения, вам понадобится соответствующий обработчик. Если вы используете какой-либо фреймворк, то рекомендую обратится к его документации. Как правило, фреймворки из коробки предоставляют инструментарий обработки исключений/ошибок. Для чистого php (и просто для общего понимания как это работает) рекомендую вам обратить внимание на эту страницу документации, а особенно set_error_handler и set_exception_handler.
Что касается возвращения "результата-объекта" - это регламентируется только авторами приложения, если вам необходимо вернуть какую-то доп. информацию о добавленном/обновленном/удаленном объекте, то в этом нет ничего страшного. Аналогично, если вы просто вернете какой-либо флаг, что операция выполнена успешно, но не вернете доп. информацию, в этом тоже нет ничего плохого. Данную информацию вы добавляете для дальнейшей обработки, если она не нужна, следовательно и возвращать данные не обязательно.