Мое приложение запускает огромную пакетную обработку внутри задачи Symfony, и я хочу получать уведомления обо всех ошибках PHP и неперехваченных исключениях.
Поэтому я попробовал sfErrorNotifierPlugin, и он отлично работает в веб-контексте (доступ к приложению из браузера); проблема в том, что я не могу заставить ее работать над моими задачами symfony.
Есть ли способ заставить его работать в задачах?
sfTask
не имеет обработки исключений, как это делает веб-интерфейс, но вы можете обойти его: в конечном итоге исключенные исключения передаются в sfErrorNotifier::notifyException
.
Оберните метод execute
своей задачи в большом блоке try-catch:
public function execute($arguments = array(), $options = array()) { try { //your code here } catch(Exception $e) { sfErrorNotifier::notifyException($e); //call the notifier throw $e; //rethrow to stop execution and to avoid problems in some special cases } }
Имейте в виду, что для правильной работы приложения требуется параметр приложения (использует настройки из app.yml).
в ProjectConfiguration.class.php
public function setup() { if ('cli' == php_sapi_name()) $this->disablePlugins('sfErrorNotifierPlugin'); }
Спасибо за вашу помощь @Maerlyn, мое решение не сильно отличается от вашего.
Я решил проблему переопределения метода doRun для моих задач таким образом:
protected function doRun(sfCommandManager $commandManager, $options) { try { return parent::doRun($commandManager, $options); } catch (Exception $e) { $this->dispatcher->notifyUntil(new sfEvent($e, 'application.throw_exception')); throw $e; } }
Это решает проблему.