Задать вопрос
@denlem
Programmer

Как кастомизировать ексепшены в общем методе?

Есть такой метод в общем сервисе, которые используется в нескольких местах в коде проекта

public function checkParams(array $params) {
        foreach($params as $param) {
            if (!in_array($param, self::ARRAY_CONSTANT)) {
                throw new CustomException('Custom message');
            }
        }
    }


Как правильно кастомизировать ексепшены с точки зрения чистого кода, ооп подхода, чтобы при вызове с разных мест использовать свой кастомный ексепшен?

Возможны ли такие подходы или может быть есть другие варианты?:

1. CustomException и 'Custom message' передавать в виде параметров или опций, примерно так:

public function checkParams($params, string $customExceptionClassName, string $customMessage) {
      ...
     }


2. Либо правильнее использовать какой то маппинг ексепшенов(в привязке на какие-то кастомные типы переданные в опциях метода) или сделать через фабрику или что то еще?
  • Вопрос задан
  • 202 просмотра
Подписаться 2 Средний 7 комментариев
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Первый вариант - это однозначно глупость. Какое-то совсем уже натягивание процедурного подхода на ООП.
Второй какой-то невнятный, про него ничего нельзя сказать толком.

В общем случае, как правильно написал sl0 в комментарии, кидать надо ОДИН тип исключения, но с разными сообщениями.

В данном конкретном случае, поскольку речь идёт о валидации, то никакое исключение в принципе кидаться не должно. Исключение кидается в случае, если функция не может выполнить свою работу. Но для функции checkParam() невалидный параметр НЕ ЯВЛЯЕТСЯ исключительной ситуацией. Потому что роль этой функции - как раз и определить валидность переданного параметра. В случае неверных данных функция должна записать сообщение об ошибке во внутренний массив ошибок класса-валидатора и вернуть false.
spoiler

Исключение в случае неверных параметров может кидать например функция сохранения в БД. Потому что её задача - сохранить переданные данные, а не валидировать их. И в случае, если функция не может сохранить данные - она должна кинуть исключение, в том числе из-за невалидности данных.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы