public function it_should_catch_any_exception_and_convert_it_to_error(RequestParserInterface $requestParser, MethodDispatcherInterface $methodDispatcher, ResponseSerializerInterface $responseSerializer, ErrorResponseFactory $errorResponseFactory) { $requestParser->parse('{"jsonrpc":"2.0","method":"calculator.calculateProfit","params":{"month":"January"},"id":"calculate-january-profit"}')->willReturn(new Request('2.0', 'calculate-january-profit', 'calculator.calculateProfit', ['month' => 'January'])); $methodDispatcher->dispatch('calculator.calculateProfit', ['month' => 'January'])->will(function () { throw new Exception('test', 32); }); $errorResponseFactory->createForException(new Exception('test', 32), 'calculate-january-profit')->willReturn(ErrorResponse::applicationDefinedError('calculate-january-profit', 'test', 32)); $responseSerializer->serializeResponse('2.0', new ErrorResponse('calculate-january-profit', new Error('test', 32)))->willReturn('{"jsonrpc":"2.0","error": {"code": 32, "message": "test"}')->shouldBeCalled(); $this->handle('{"jsonrpc":"2.0","method":"calculator.calculateProfit","params":{"month":"January"},"id":"calculate-january-profit"}')->shouldBeLike('{"jsonrpc":"2.0","error": {"code": 32, "message": "test"}'); }
/** * @param \Exception $exception * @param string|null $id * * @return ErrorResponse */ public function createForException(\Exception $exception, $id = null) { switch (true) { case $exception instanceof ParseException: return ErrorResponse::parseError($exception->getMessage() ?: 'Parse error'); case $exception instanceof InvalidRequestException: return ErrorResponse::invalidRequestError($exception->getMessage() ?: 'Invalid request'); case $exception instanceof MethodNotFoundException: return ErrorResponse::methodNotFoundError($id, $exception->getMessage() ?: 'Method not found'); case $exception instanceof InvalidCallableArgumentsException: case $exception instanceof InvalidMethodParametersException: return ErrorResponse::invalidParamsError($id, $exception->getMessage() ?: 'Invalid params'); case $exception instanceof ApplicationDefinedException: return ErrorResponse::applicationDefinedError($id, $exception->getMessage(), $exception->getCode()); case $exception instanceof \Exception: default: if ($this->exposeInternalExceptions) { return new ErrorResponse($id, new Error($exception->getMessage(), $exception->getCode())); } return ErrorResponse::applicationError($id); } }