Исключения PHP - мы можем сделать несколько бросков? - PullRequest
3 голосов
/ 02 сентября 2010
    if ($disponivel === 0)
    {
        $razao = $check->cd->reason;
        $mensagem = "the domain isn't available. Reason: ".$razao;
    }
    elseif($disponivel === 1)
    {
        $mensagem = "the domain doesn't exist - free to register.";
    }

    return $mensagem;
}
else
{
    throw new EppCommandsExceptions('Domain isn't supported - '.$result->msg, $codigo);
}

Вы видите эти строки $ mensagem? Они также являются сообщениями об ошибках, и мой вопрос, вместо того, чтобы $ mensagem отображал некоторые сообщения об ошибках, можем ли мы вместо этого использовать несколько исключений throw?

Обновление: Я не хочу бросать исключения сразу. Каждое исключение в свое время.

Спасибо заранее, MEM

Ответы [ 4 ]

5 голосов
/ 30 октября 2015

Вы не можете выбросить несколько, но начиная с PHP 5.3 вы можете указать previous для конструктора Exception, чтобы создать связанный список исключений.

Например, вот цепочка из 3 предметов:

$a = new Exception('Exception a');
$b = new Exception('Exception b', 0, $a);
throw new Exception('Exception c', 0, $b);

Затем в вашем обработчике исключений вы можете перемещаться по цепочке с помощью getPrevious

do {
    printf("%s:%d %s (%d) [%s]\n", $e->getFile(), $e->getLine(), $e->getMessage(), $e->getCode(), get_class($e));
} while($e = $e->getPrevious());
5 голосов
/ 02 сентября 2010

Вы имеете в виду что-то вроде

else {
    throw new XException(...);
    throw new YException(...);
    throw new ZException(...);
}

... и все они брошены "сразу"?

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

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

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

catch(SomeException $e) {
    $messages = $e->getErrorMessages();
}

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

РЕДАКТИРОВАНИЕ / ОБНОВЛЕНИЕ:

@ MEM спасибо за обновление вашего кода сообщениями об ошибках на английском языке.Вы реализуете что-то вроде службы регистрации доменов?

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

Когда я выброшу исключение в приложении, подобном вашему?Я не очень разбираюсь в регистрации доменов, но если вы извлекаете информацию о том, свободен домен или нет, с удаленного сервера / веб-службы, а эта веб-служба не работает, я бы выдал исключение.Он попадает в контроллер (я представляю веб-приложение MVC), который, в свою очередь, отвечает клиенту сообщением «Сервер отключен, повторите попытку позже».

1 голос
/ 02 сентября 2010

вы можете бросать и ловить разные исключения.

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

function myFunction() {
  if($a) {
    throw new AException('A Error');
  } else if($b) {
    throw new BException('B Error');
  } else if($c) {
    throw new CExceptıon('C Error');
  }
}

try {
  myFunctıon();
} catch (AException $aException) {
  echo $aException->getMessage();
} catch (BException $bException) {
  echo "this is a terrible case, don't do that again pls";
  $mydbobject->rollback();
} catch (CException $cException) {
  mailDevTeam("the server made a boo boo");
}
0 голосов
/ 02 сентября 2010

Конечно, просто создайте подкласс базового исключения для каждого сообщения.

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