Допустимо ли передать исключение в функцию, которая затем может или не может бросить его?


Я все еще получаю повесить обработку исключений в PHP; здесь есть сценарий, где я использую конвенции: Есть моменты, где у меня есть SQL-запрос, который мне нужно, чтобы превратиться в объект, так что я написал эту утилиту класс/метод.

Class A {
    public static function getThatOneInstance(){
        $sql = "SELECT id FROM table WHERE condition=met LIMIT 1";
        $O = UtilsMysql::fetchIdIntoInstance($sql, __CLASS__, new Exception('Not Found!?'));
        return $O;
    }
}

Class UtilsMysql {
    public static function fetchIdIntoInstance($sql, $Class, Exception $NotFoundE = NULL){
        $O = NULL;
        $r = mysql_query($sql);
        if (!$r) throw new ExceptionMySQL($sql);
        if (mysql_num_rows($r) > 0) {
            list($id) = mysql_fetch_row($r);
            $O = new $Class($id);
        } elseif (!is_null($NotFoundE)) {
            throw $NotFoundE;
        }
        return $O;
    }
}

Бывают случаи, хотя, если нет результата, возвращенный из запроса, он представляет собой исключительное обстоятельство, и поэтому исключение быть брошенным. Потому что это не редкость, а не всегда проверяет возвращаемое значение из метода утилита, я начал прохождение в исключение, что будет брошен, если никакие результаты не найдены. Таким образом, у меня есть контракт с функцией, если я пройду в исключение, я могу рассчитывать на то, что он возвращает объект (не надо испытать его).

Допустимо ли передать исключение в функцию, которая затем может или не может бросить его?



329
2
задан 12 декабря 2011 в 07:12 Источник Поделиться
Комментарии
2 ответа

Как сказал Уинстон, используйте полные имена для ваших переменных. Также имейте дела последовательны - тогда, когда вы пишете объекта $вместо $объект, он будет более очевидным.

Статические должны почти никогда не будет использоваться, если вы пишете объектно-ориентированный код. Вы в основном пространстве имен функции с этим кодом. Вместо того, чтобы написать статический класс utils для SQL я бы написал класса SQL (или используйте существующую). Если вы хотите, чтобы объекты класса должны быть созданы PDO может сделать это для вас.

Насколько исключение:

Нет, вы не должны этого делать. Ваш код создает объект, что его не нужно каждый раз, когда функция вызывается. В худшем случае вы прошли бы в исключения строку и инстанцируется с нового исключения в fetchIdIntoInstance.

Главная Рекомендация

Вы лучше иметь дело с исключением после того, как это произошло на таком уровне, когда вы знаете, почему это произошло.

Держите свои функции нижнего уровня простой: если происходит что-то странное исключение. В вашем случае я предполагаю, что SQL должен работать в fetchIdIntoInstance и бросать исключение, если вы не можете сделать новый экземпляр.

На более высоком уровне операции с базой данных будут иметь значение. Вы будете делать что-то особенное, что легко понять. Может быть, вы будете добавлять записи в таблицу или значение объекта, который вы планируете быть в базе данных. На данный момент Вы можете обработать исключение и написать значимую информацию в лог-файл или что-то подобное.

Вы могли бы поймать исключение в getThatOneInstance , но это не похоже на правильное место. Я думаю, что вы должны поймать его выше, где вы знаете, что с ним делать.

1
ответ дан 13 декабря 2011 в 02:12 Источник Поделиться

Своего рода странным.

Я хотел бы предложить, имеющий вторую функцию, которая бросает исключения, когда строки не возвращаются.

Я бы также настоятельно рекомендуем вам прекратить использовать переменные, такие как $O и $р, они делают ваш код намного сложнее читать.

0
ответ дан 12 декабря 2011 в 07:12 Источник Поделиться