控制台异常并使用ExceptionHandler将致命错误转换为异常

时间:2015-05-21 13:37:29

标签: symfony exception error-handling console command

我的目标是保存控制台命令期间发生的异常和错误。

我正在使用console.exception本机symfony事件,注册如下:

kernel.listener.console:
        class: Evo\CronBundle\EventListener\ConsoleListener
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: kernel.event_listener, event: console.exception, method: onConsoleException }

我正在运行以下自定义命令:

<?php
namespace Evo\CronBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Evo\CronBundle\Event\CustomConsoleCommandEvent;
use Evo\CronBundle\Event\CustomConsoleTerminateEvent;
use Evo\CronBundle\Event\CustomConsoleExceptionEvent;
use Evo\CronBundle\EvoCronEvents;


class SendPostRegistrationMail1Command extends ContainerAwareCommand
{
    /**
     * Configure command
     */
    protected function configure()
    {
        $this->setName('evo:send_post_registration_mail_1')
            ->setDescription('Send Post Registration mail #1')
        ;
    }

    /**
     * Execute command
     *
     * @param InputInterface $input
     * @param OutputInterface $output
     * @return int|null|void
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        throw new \Symfony\Component\Debug\Exception\FatalErrorException('test');
    }
}

抛出的异常会触发事件,我可以在其中转储我将保存到数据库中的异常:

<?php

namespace Evo\CronBundle\EventListener;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Console\Event\ConsoleExceptionEvent;
use Evo\CronBundle\Entity\CommandException;

class ConsoleListener
{
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $em;

    /**
     * @var \Evo\CronBundle\Entity\CommandExecution
     */
    private $commandExecution;

    /**
     * Constructor
     *
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    /**
     * onConsoleException
     *
     * @param ConsoleExceptionEvent $event
     */
    public function onConsoleException(ConsoleExceptionEvent $event)
    {
        $exception = $event->getException();

        echo '<pre>';
        \Doctrine\Common\Util\Debug::dump($exception);
        echo '</pre>';
        die();
    }
}

显示

object(stdClass)#548 (6) {
  ["__CLASS__"]=>
  string(53) "Symfony\Component\Debug\Exception\FatalErrorException"
  ["message"]=>
  string(4) "test"
  ["code"]=>
  int(0)
  ["file"]=>
  string(94) "C:\server\www\evoportail-zfony\src\Evo\CronBundle\Command\SendPostRegistrationMail1Command.php"
  ["line"]=>
  int(59)
  ["severity"]=>
  int(1)
}

在这种情况下,异常正确填充了消息,异常类就是我在命令中抛出的异常类。

但是,如果我故意触发一个php致命错误,使Symfony使用Exceptionhandler将其转换为异常,例如:

/**
     * Execute command
     *
     * @param InputInterface $input
     * @param OutputInterface $output
     * @return int|null|void
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        strpos();
    }

我的活动中转储的例外情况如下:

object(stdClass)#642 (6) {
  ["__CLASS__"]=>
  string(48) "Symfony\Component\Debug\Exception\DummyException"
  ["message"]=>
  string(0) ""
  ["code"]=>
  int(0)
  ["file"]=>
  string(98) "C:\server\www\evoportail-zfony\vendor\symfony\symfony\src\Symfony\Component\Debug\ErrorHandler.php"
  ["line"]=>
  int(162)
  ["severity"]=>
  int(1)
}

这是在\ Symfony \ Component \ Debug \ ErrorHandler.php中抛出的DummyException,它与我的命令中触发的错误没有任何关系。我是否错过了有关此ErrorHandler应该将错误转换为异常的内容?

0 个答案:

没有答案