я сделал простой инструмент командной строки с Symfony2, который вызывает службу, которая бросает UniverseException
в случае ошибки. Вроде как это;
# /src/AppBundle/Command/UniverseCommand.php
class UniverseCommand extends ContainerAwareCommand
{
protected function execute(InputInterface $input, OutputInterface $output)
{
if ( 1 == 2 )
throw new UniverseException('Strange things are afoot');
}
}
Я также добавил CommandExceptionListener
который может восстановить мое приложение, если MyAppBundleException
брошен
# /src/AppBundle/EventListener/CommandExceptionListener.php
class CommandExceptionListener
{
public function onConsoleException(ConsoleExceptionEvent $event)
{
if ($exception instanceof UniverseException) {
// Reboot the universe
// Continue existence..?
}
}
}
Работает отлично!
Но теперь я хотел бы запустить команду как демон, используя daemonizable-команда расслоение. Если моя служба выдает исключение, выполнение останавливается, и это создает ужасного демона!
Мое приложение уже обработало этот тип исключения. Есть ли способ восстановиться и позволить моему демону продолжить работу?
РЕДАКТИРОВАТЬ:
Я пытался добавить try
/catch
в команде вот так ..
# /src/AppBundle/Command/UniverseCommand.php
class UniverseCommand extends ContainerAwareCommand
{
protected function execute(InputInterface $input, OutputInterface $output)
{
try{
if ( 1 == 2 )
throw new UniverseException('Strange things are afoot');
}catch(\Exception $e){
echo 'The universe behaved badly but I rebooted it.';
}
}
}
Это ловит исключение, и демон продолжается! Но теперь, конечно, мой слушатель событий не запускается, и исключение не обрабатывается должным образом.
Задача ещё не решена.
Других решений пока нет …