Какова цель немедленного отбрасывания всех исключений? - PullRequest
1 голос
/ 12 марта 2020

Документация для Doctrine ORM гласит:

Обратите внимание, что при перехвате Exception обычно следует повторно выдать исключение.

Зачем ты это делаешь? В чем причина этого? Почему бы не использовать блок try/catch? Не будет ли это:

try {
  /** @var EntityManager $em */
  $em->persist($user);
  $em->flush();
} catch (EntityException $e){
  throw  $e;
} catch (\Exception $e){
  throw  $e;
}

таким же, как этот?

/** @var EntityManager $em */
$em->persist($user);
$em->flush();

Какова цель немедленного сброса всех исключений?

1 Ответ

0 голосов
/ 12 марта 2020

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

Упомянутая вами цитата взята из главы «Транзакции и параллелизм», конкретно к явно разграниченным транзакциям .

Цитата относится к такому виду кода:

$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
    //... do some work
    $user = new User;
    $user->setName('George');
    $em->persist($user);
    $em->flush();
    $em->getConnection()->commit();
} catch (Exception $e) {
    $em->getConnection()->rollBack();
    throw $e;
}

В этом случае транзакция сначала разграничивается вызовами beginTransaction() и commit().

Если вы не используете для этого блок catch, вы не сможете выдать rollBack() и оставите транзакцию открытой. Да, он may автоматически откатывается при закрытии соединения, но лучше, если вы сделаете это явно.

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

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