Бросать исключения и возвращать типы - PullRequest
4 голосов
/ 15 июля 2010

При создании нового исключения лучше просто возвращать true, если исключение не требуется. В качестве альтернативы лучше вернуть false, а не выдавать исключение. Я использую php.

Ответы [ 2 ]

13 голосов
/ 15 июля 2010

Все зависит от того, что вы делаете.Лично я использую их все время, так что мне не нужно проверять возвращаемое значение (глупый, но показательный пример):

function ArrayToObject(array $array) {
    $obj = new StdClass();
    foreach ($array as $key => $value) {
        if (!is_string($key)) {
            throw new Exception('Expects only string keys in the array');
        }
        $obj->$key = $value;
    }
    return $obj;
}

Таким образом, я могу сделать:

$array = array('foo' => 'bar');
try {
    echo ArrayToObject($array)->foo; //Prints "bar"
} catch (Exception $e) {
    //Handle error here
}

Это позволяет вам не беспокоиться об ошибках проверки ваших результатов.Вы можете обрабатывать ошибки прямо в блоке catch.

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

Более реальный пример (в псевдокоде):

try {
    open database connection;
    send query to database;
    operate on results;
} catch (DatabaseConnectionException $e) {
    handle failed connection here;
} catch (DatabaseQueryException $e) {
    handle failed query here;
} catch (Exception $e) {
    handle any other errors here;
}

Очевидно, это предполагает, что функции / методы вашей базы данных выдают эти исключения ...

0 голосов
/ 15 июля 2010

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

Аналогично, не используйте возвращаемые значения для обозначения непредвиденных ситуаций. Если ваша функция не вернет ничего значащего для ссылки на нулевой указатель, делит на ноль, без подключения к данным, вы должны выбросить исключение. Во-первых, это позволит вам изолировать код обработки ошибок с помощью блока catch. Во-вторых, это позволяет вам предоставить больше информации о том, почему это не удалось, а не просто «ложь». Очень раздражает, когда что-то не получается и вся информация, которую вы получаете, это просто «ошибка».

Кроме того, вы не хотите создавать исключения как альтернативу управлению потоком. Вы можете проявить творческий подход и написать функцию сравнения, которая ничего не будет делать, если она будет равна, выкинет исключение GreaterThanException или LessThanException, если она не будет равна. Но теперь вы утратили преимущество разделения кода обработки ошибок (поскольку стандартный код обработки теперь содержится в блоках catch вместе с кодом ошибки). Кроме того, хотя я не уверен в производительности обработки исключений во многих средах, таких как php, вероятно, стоит создать объект исключения и выполнить сравнение типов для блоков catch вместо простого возврата.

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