Раздувать исключения в PHP? - PullRequest
3 голосов
/ 21 ноября 2010

Я делаю простую карточную игру на PHP.Когда пользователь пытается разыграть карту, я хочу выдать исключение, если он может / не может.Вместо того, чтобы возвращать число с определенным значением (например, 1 означает плохую карту, 2 означает не ваша очередь ... и т. Д.), Я хотел использовать настраиваемые исключения.Я поймал бы эти исключения и отобразил бы сообщение пользователю.

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

Проблема: мои исключения неясны.У меня есть страница с именем play.php, которая управляет классом Game, у которого есть Round, который выдает исключение.Страница play.php получает информацию об игре и выполняет вызовы функций.Тем не менее, он говорит, что исключение не пойман в раунде.

Есть ли быстрое решение для этого?Как я могу добавить исключение из моего класса Round на мою страницу play.php?

// in PLAY.php
try {
    $game->round->startRound($game->players);
} catch (RoundAlreadyStartedException $e) {
    echo $e->getMessage();
}

// in ROUND class
        if (!($this->plays % (self::PLAYS_PER_ROUND + $this->dealer))) {
            try {
                throw new RoundAlreadyStartedException();
            } catch (RoundAlreadyStartedException $e) {
                throw $e;
            }
            return;
        }

Я пытался ловить, не ловить, бросать, бросать и т. Д.

Ответы [ 3 ]

6 голосов
/ 21 ноября 2010

Я согласен с некоторыми комментариями, что это странный способ достичь того, что вы хотите сделать, однако я не вижу никаких реальных проблем с кодом. Мой тестовый пример:

class TestException extends Exception {
}

function raiseTestException() {
    try {
        throw new TestException("Test Exception raised");
    } catch(TestException $e) {
        throw $e;
    }
    return;
}

try {
    raiseTestException();
} catch(TestException $e) {
    echo "Error: " . $e->getMessage();
}

// result: "Error: Test Exception raised";

Это на самом деле RoundAlreadyStartedException, который не был пойман, или какая-то другая ошибка?

РЕДАКТИРОВАТЬ: обернутый в классы, на случай, если он что-то изменит (не делает):

class TestException extends Exception {
}

class TestClass {

    function raiseTestException() {
        try {
            throw new TestException("Test Exception raised");
        } catch(TestException $e) {
            throw $e;
        }
        return;
    }

}

class CallerClass {

    function callTestCallMethod() {
        $test = new TestClass();
        try {
            $test->raiseTestException();
        } catch(TestException $e) {
            echo "Error: " . $e->getMessage();
        }
    }

}

$caller = new CallerClass();
$caller->callTestCallMethod();

// result: "Error: Test Exception raised";
3 голосов
/ 02 апреля 2014

У меня было такое же странное поведение с исключениями, которые не пузырились. Оказывается, у меня были исключения в другом пространстве имен, но я не использовал их явно, и PHP не жаловался на это. Итак, добавление using mynamespace\exceptions\MyException; решило это. Может быть, это могло случиться и с тобой.

НТН.

1 голос
/ 19 октября 2014

У меня точно такая же проблема в Laravel 4.2

Поскольку Laravel слушает обработчик \ Exception, вы не можете использовать корень, чтобы выдать исключение и ожидать появления пузыря в приложении, если вы не изменили или не расширили Laravel. Вам нужно создать пустое Исключение, которое расширяет \ Exception для вашего пространства имен, а затем перехватить ваше Исключение в пространстве имен, как только вам это понадобится.

<?php
namespace Yournamespacehere;

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