Исключения и отмена - PullRequest
       0

Исключения и отмена

0 голосов
/ 20 сентября 2010

Это может быть немного глупым вопросом, но это меня беспокоит, так что вот так

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

Мне кажется, что аннулирование между этими двумя случаями находится в некоторой серой зоне

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

Можно ли отменить отмену в этом контексте?

Ответы [ 3 ]

2 голосов
/ 20 сентября 2010

Исключения наиболее эффективны в редких случаях, когда требуется нелокальная обработка.Похоже, что это применимо здесь.Так что это чисто стилистический вопрос.О нелокальной передаче управления может быть сложнее думать, но это, вероятно, также будет означать более короткий кодЯ бы основывал решение, основываясь на том, что это за язык и сколько существующего кода уже разработано за исключением.Если у вас уже есть код очистки для исключений, используйте его.

0 голосов
/ 20 сентября 2010

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

<?php
class hideAndSeekWithOnlyOneOtherPlayer {
    public function seek() {
        foreach($rooms as $room) {
            if($this->checkRoom($room)) {
                $this->shoutThatIFoundYou();
                return;
            }
        }
        $this->shoutThatICantFindYou();
    }
    function checkRoom($room) {
        $hideouts = $this->getPossibleHideoutsForRoom($room);
        return $this->checkHideouts($hideouts);
    }
    function checkHideouts($hideouts) {
        foreach($hideouts as $hideout) {
            return $this->checkHideout($hideout);

        }
        return false;
    }
    function checkHideout($hideout) {
        $this->walkToHideout();
        return $this->seeIfPersonIsInsideHideout();
    }
}
?>

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

0 голосов
/ 20 сентября 2010

Я бы не использовал «исключение» в его буквальном определении.То, что вы могли бы выбрать - это захват отмены как пользовательское значение, возможно, логическое, которое указывает, что пользователь отменил действие, и использовать это логическое значение, чтобы не выполнять исчерпывающие проверки состояния ошибки.

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