diff --git a/src/Payload/Generator.php b/src/Payload/Generator.php index 8d81979..f83f135 100755 --- a/src/Payload/Generator.php +++ b/src/Payload/Generator.php @@ -30,31 +30,54 @@ public function __construct(ContainerInterface $container) * * @return array */ - public function getExceptionPayload(\Exception $exception) + public function getExceptionPayload($exception) { - // handle exception - $chain = new TraceChain(); - $item = new TraceItem(); - - $data = $item($exception); - $message = $data['exception']['message']; - /** * Build payload * @link https://rollbar.com/docs/api/items_post/ */ $payload = [ - 'body' => ['trace_chain' => $chain($exception)], - 'request' => $this->getRequestInfo(), - 'environment' => $this->getKernel()->getEnvironment(), + 'body' => [], 'framework' => \Symfony\Component\HttpKernel\Kernel::VERSION, - 'language_version' => phpversion(), 'server' => $this->getServerInfo(), + 'language_version' => phpversion(), + 'request' => $this->getRequestInfo(), + 'environment' => $this->getKernel()->getEnvironment(), ]; + // @link http://php.net/manual/en/reserved.constants.php + // @link http://php.net/manual/en/language.errors.php7.php + if (!($exception instanceof \Exception) || PHP_MAJOR_VERSION > 7 && !($exception instanceof \Throwable)) { + $payload['body'] = $this->buildGeneratorError($exception, __FILE__, __LINE__); + + return ['Undefined error', $payload]; + } + + // handle exception + $chain = new TraceChain(); + $item = new TraceItem(); + + $data = $item($exception); + $message = $data['exception']['message']; + $payload['body'] = ['trace_chain' => $chain($exception)]; + return [$message, $payload]; } + /** + * @param $object + * @param $file + * @param $line + * + * @return array + */ + protected function buildGeneratorError($object, $file, $line) + { + $item = new ErrorItem(); + + return ['trace' => $item(0, serialize($object), $file, $line)]; + } + /** * @param int $code * @param string $message diff --git a/tests/SymfonyRollbarBundle/EventListener/ExceptionListenerTest.php b/tests/SymfonyRollbarBundle/EventListener/ExceptionListenerTest.php index 4f3884a..d58a904 100755 --- a/tests/SymfonyRollbarBundle/EventListener/ExceptionListenerTest.php +++ b/tests/SymfonyRollbarBundle/EventListener/ExceptionListenerTest.php @@ -1,11 +1,13 @@ getContainer(); $generator = $container->get('symfony_rollbar.payload.generator'); - $ctnr = $generator->getContainer(); + $result = $generator->getContainer(); - $this->assertEquals($container, $ctnr); + $this->assertEquals($container, $result); } public function testGetKernel() @@ -198,4 +198,38 @@ public function testGetExceptionPayload() $this->assertEquals(phpversion(), $payload['language_version']); $this->assertEquals($serverInfo, $payload['server']); } + + /** + * @dataProvider generatorStrangeData + * @param mixed $data + */ + public function testStrangeException($data) + { + /** + * @var \SymfonyRollbarBundle\Payload\Generator $generator + */ + $container = static::$kernel->getContainer(); + $generator = $container->get('symfony_rollbar.payload.generator'); + + list($message, $payload) = $generator->getExceptionPayload($data); + + $this->assertEquals('Undefined error', $message); + $this->assertNotEmpty($payload['body']['trace']); + } + + /** + * @return array + */ + public function generatorStrangeData() + { + return [ + ['zxcv'], + [1234], + [0.2345], + [null], + [(object)['p' => 'a']], + [['s' => 'app', 'd' => 'web']], + [new ErrorItem()], + ]; + } }