def toRetryException()

in support-workers/src/main/scala/com/gu/support/workers/exceptions/ErrorHandler.scala [27:67]


  def toRetryException(throwable: Throwable): RetryException =
    throwable match {
      case e: RetryException => e
      case e: StripeError => fromStripeError(e)
      case e: PayPalError => e.asRetryException
      case e: ZuoraErrorResponse => e.asRetryException
      case e: SalesforceErrorResponse => e.asRetryException
      case e: BuildSubscribePromoError => new RetryNone(e.cause.msg, cause = e)
      case e: StateNotValidException => new RetryNone(e.message, cause = e)
      case e: BadRequestException => new RetryNone(e.getMessage, cause = e)
      case wshe: WebServiceHelperError[_] if wshe.cause.isInstanceOf[DecodingFailure] =>
        // if we fail to parse SalesForce response or any JSON response, it means something failed
        // or we had malformed input, so we should not retry again.
        new RetryNone(message = wshe.getMessage, cause = wshe.cause)

      // Timeouts/connection issues and 500s
      case e @ (_: SocketTimeoutException | _: SocketException | _: WebServiceHelperError[_] | _: SSLException) =>
        new RetryUnlimited(message = e.getMessage, cause = throwable)

      // WebServiceClientError
      case e @ (_: WebServiceClientError) if e.codeBody.code == "401" =>
        // We are retrying on 401s now because we have been receiving this
        // response from Zuora during maintenance windows
        new RetryLimited(message = e.getMessage, cause = throwable)

      case e @ (_: WebServiceClientError) if e.codeBody.code == "429" =>
        // We are retrying on 429 (rate limit) errors now because we have been hitting Zuora's rate limit at
        // times when their responses are particularly slow. Retrying with a back off should ensure that these
        // requests succeed at a later stage.
        new RetryUnlimited(message = e.getMessage, cause = throwable)

      case e @ (_: WebServiceClientError) =>
        new RetryNone(message = e.getMessage, cause = throwable)

      // Invalid Json
      case e @ (_: ParsingFailure | _: MatchError) =>
        new RetryNone(message = e.getMessage, cause = throwable)

      // Any Exception that we haven't specifically handled
      case e: Throwable => new RetryLimited(message = e.getMessage, cause = throwable)
    }