$catchableExceptions * @param LoggerInterface $logger * @param callable $callback * @return mixed * @throws Exception */ protected function retryingFailRequest( int $count, float $sleep, array $catchableExceptions, LoggerInterface $logger, callable $callback ): mixed { for ($i = 0; ; $i++) { try { return $callback(); } catch (Exception $e) { foreach ($catchableExceptions as $exceptionClass) { if ($e instanceof $exceptionClass) { $logger->error("transport: fail request retrying... got catchable exception", [ 'exception' => $e, 'try' => $i ]); usleep((int) ($sleep * 1_000_000)); if ($i == $count) { throw $e; } continue 2; } } throw $e; } } // phpstan fail return null; } }