Пользовательское исключение для каждого неверного значения ввода - PullRequest
1 голос
/ 22 февраля 2020

У меня есть бэкэнд-проект, в котором существует собственное «родительское исключение», что-то вроде этого (также у меня есть InvalidArgumentException, полученное из этого исключения):

class CaliException extends \Exception {
    private $caliCode;

    public function __construct(string $message = "", string $caliCode = self::UNDEFINED_CODE,
                                int $code = 0, Throwable $previous = null) {
        parent::__construct($message, $code, $previous);

        $this->caliCode = $caliCode;
    }

    function getCaliCode(): string {
        return $this->caliCode;
    }
}

Это ясно из кода выше, эта цель пользовательского класса заключается в способности хранить строковые коды. Зачем мне нужны строковые коды? Потому что у меня есть HTTP API, который работает следующим образом:

  1. Получить JSON запрос
  2. Сделать что-то
  3. Создать JSON вывод с полем 'state' который содержит либо код сгенерированного исключения, либо ответ «200». Эти коды состояния очень полезны для клиента, который может различать guish различных проблем и реагировать на них соответственно.

Так что есть проблема. Приведенная выше система создает код, подобный следующему:

class UsernameFormatException extends InvalidArgumentException {
    public const USERNAME_FORMAT_UNDEFINED_CODE = "DM:USERCA:0001";

    public function __construct(string $message = "", string $calistoCode = self::USERNAME_FORMAT_UNDEFINED_CODE,
                                int $code = 0, \Throwable $previous = null) {
        parent::__construct($message, $calistoCode, $code, $previous);
    }
}

class PasswordFormatException extends InvalidArgumentException {
    public const PASSWORD_FORMAT_UNDEFINED_CODE = "DM:USERCA:0002";

    public function __construct(string $message = "", string $calistoCode = self::PASSWORD_FORMAT_UNDEFINED_CODE,
                                int $code = 0, \Throwable $previous = null) {
        parent::__construct($message, $calistoCode, $code, $previous);
    }
}

class InvalidLastActivityTimestampException extends InvalidArgumentException {
    public const INVALID_TIMESTAMP = "DM:USERCA:0003";

    public function __construct(string $message = "", string $calistoCode = self::INVALID_TIMESTAMP,
                                int $code = 0, \Throwable $previous = null) {
        parent::__construct($message, $calistoCode, $code, $previous);
    }
}

class InvalidCreationTimestampException extends InvalidArgumentException {
    public const INVALID_TIMESTAMP = "DM:USERCA:0004";

    public function __construct(string $message = "", string $calistoCode = self::INVALID_TIMESTAMP,
                                int $code = 0, \Throwable $previous = null) {
        parent::__construct($message, $calistoCode, $code, $previous);
    }
}

Как видно, для каждого случая недопустимого аргумента я создаю новое CaliException полученное исключение . Я считаю это не круто. Это хорошо? Как я могу улучшить код?

Бонусный вопрос: я прочитал, что должен выбросить \InvalidArgumentException, когда это ошибка программиста, поэтому исключение не должно быть поймано. Но в моем коде нет \InvalidArgumentException только моей собственной версии этого. Является ли это приемлемым в контексте лучших практик и т. Д.? И как отличить guish, когда это ошибка программиста и когда это ошибка пользователя (неверный ввод пользователя)? (В конце концов, любые недопустимые значения, переданные функции, являются недопустимыми входные данные относительно этой функции)

1 Ответ

0 голосов
/ 23 февраля 2020

Из вашего описания кажется, что вы на самом деле делаете что-то вроде REST API. Или, по крайней мере, что-то вдохновленное этой концепцией.

Что касается исключений InvalidArgumentException, так это то, что кто-то передал вам знание 2-й или 3-й руки. Эти исключения должны быть обнаружены, но не на уровне сущности домена или службы . Вместо этого вы ловите их в точке .. ну .. bootstrap -уровня, где вы выводите ответ «довольно ошибка json» со всеми заголовками и кодами состояния.

Что касается вашего исходного вопроса. Да, с очень конкретными c исключениями все в порядке. Хотя я бы порекомендовал вместо PasswordFormatException назвать его MalformedPassword. По сути, отказывайтесь от суффикса *Exeception по той же причине, что у вас нет суффикса class UserClass - он бесполезен, у PHP теперь есть пространства имен (с 2005 года ... я думаю).

Это просто быстрый комментарий. Я даже не уверен, что он отвечает на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...