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)
}