Какое исключение SPL я должен использовать при проверке данных набора перед процессом? - PullRequest
3 голосов
/ 09 марта 2011

Я изо всех сил пытаюсь разобраться, когда я использую пару PHP SPL Exceptions , в частности, в приведенном ниже сценарии:

class MyClass {
    protected $data1;
    protected $data2;

    public function setData1($data1) {
        $this->data1 = $data1;
    }

    public function setData2($data2) {
        $this->data2 = $data2;
    }

    public function invokeProcess() {
        $this->validateData();
    }

    protected function validateData() {
        if(!$this->data1) {
            // Which Exception do I throw? See explanation below
        }

        if($this->data1 && $this->data2) {
            // Which Exception do I throw? See explanation below
        }
    }
}

У меня есть класс, которыйпостроен.Затем пользователь устанавливает некоторые данные для объекта и вызывает процесс.Первое, что делает этот процесс, проверяет данные на объекте, чтобы убедиться, что требуемые данные присутствуют, комбинации данных правильны и т. Д., А если нет, то должно быть выдано исключение.

Так какие же исключения я выбрасываю?

Моя проверка действительно проверяет два сценария,

  1. Пропущенные данные, то есть данные, которые не были установлены.
  2. Неправильная комбинация данных.

Для # 1 я разрывался между BadMethodCallException, RuntimeException и LogicException.Что касается # 2, я думаю, что это просто LogicException?

Итак, какие из них я использую?

Примечание: Прежде чем кто-либо спросит, я не могуиметь требуемые данные в качестве параметров в конструкторе, поскольку некоторые данные требуются только при задании других данных и т. д.

Ответы [ 3 ]

5 голосов
/ 09 марта 2011

Если у вас есть для использования исключения SPL, это будет RuntimeException. Это та, которая относится к ошибке, которая может быть обнаружена только во время выполнения (например, неверные входные данные).

LogicException будет неуместным выбором, так как относится к логической ошибке в вашей программе , а не к полученным данным. Подумайте о LogicException как о кнопке паники, когда ваша программа обнаружит, что условие, которое всегда должно быть истинным, не соответствует действительности (в отличие от условия, что должно быть верным для программы, чтобы выполнять свои функции).

BadMethodCallException также будет неуместным, поскольку оно представляет

Исключение выдается, если обратный вызов ссылается к неопределенному методу или если некоторые аргументы отсутствуют.

Некоторые данные, которые нужны вашей логике, могут отсутствовать, но там нет вызова метода без правильного количества аргументов.

На вашем месте я бы либо определил свои собственные исключения (полученные из RuntimeException), либо использовал RuntimeException напрямую.

3 голосов
/ 09 марта 2011

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

Например, вы могли бы иметь:

  • Суперкласс под названием ValidationException, который будет расширяться Exception.
  • Это будет наследоваться двумя подклассами:
    • ValidationException_MissingData
    • ValidatonException_BadCombination


Вам не обязательно использовать ранее существовавшие исключения SPL, если они не соответствуют вашей ситуации: механизм исключений достаточно мощный, чтобы позволить вам определить все, что вам нужно, и это, например, делает большинство Frameworks. 1024 *


Подробнее о том, как это сделать, см. Расширение исключений .

1 голос
/ 09 марта 2011

Я бы лично бросил InvalidArgumentException в каждый set*() метод.

...