getInstantiator()->instantiate($type); foreach (['code', 'message', 'file', 'line'] as $attribute) { if (isset($data[$attribute])) { $property = ReflectionManager::reflectProperty($type, $attribute); $property->setValue($exception, $data[$attribute]); } } return $exception; } catch (ReflectionException) { return new RuntimeException(sprintf( 'Bad data %s: %s', $data['class'], $data['message'] ), $data['code']); } catch (TypeError) { return new RuntimeException(sprintf( 'Uncaught data %s: %s', $data['class'], $data['message'] ), $data['code']); } } return new RuntimeException('Bad data data: ' . json_encode($data)); } public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool { return class_exists($type) && is_a($type, Throwable::class, true); } public function normalize(mixed $object, ?string $format = null, array $context = []): null|array|ArrayObject|bool|float|int|string { if ($object instanceof Serializable) { return serialize($object); } /* @var \Throwable $object */ return [ 'message' => $object->getMessage(), 'code' => $object->getCode(), 'file' => $object->getFile(), 'line' => $object->getLine(), ]; } public function supportsNormalization(mixed $data, ?string $format = null, array $context = []): bool { return $data instanceof Throwable; } public function hasCacheableSupportsMethod(): bool { return get_class($this) === __CLASS__; } public function getSupportedTypes(?string $format): array { return ['object' => static::class === __CLASS__]; } protected function getInstantiator(): Instantiator { if ($this->instantiator instanceof Instantiator) { return $this->instantiator; } return $this->instantiator = new Instantiator(); } }