All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sttp.client3.SttpClientException.scala Maven / Gradle / Ivy

The newest version!
package sttp.client3

import sttp.monad.MonadError

/** Known exceptions that might occur when using a backend. Currently this covers:
  *   - connect exceptions: when a connection (tcp socket) can't be established to the target host
  *   - read exceptions: when a connection has been established, but there's any kind of problem receiving or handling
  *     the response (e.g. a broken socket or a deserialization error)
  *
  * In general, it's safe to assume that the request hasn't been sent in case of connect exceptions. With read
  * exceptions, the target host might or might have not received and processed the request.
  *
  * The [[SttpBackend.send]] methods might also throw other exceptions, due to programming errors, bugs in the
  * underlying implementations, bugs in sttp or an uncovered exception.
  *
  * @param request
  *   The request, which was being sent when the exception was thrown
  * @param cause
  *   The original exception.
  */
abstract class SttpClientException(val request: Request[_, _], val cause: Exception)
    extends Exception(s"Exception when sending request: ${request.method} ${request.uri}", cause)

object SttpClientException extends SttpClientExceptionExtensions {
  class ConnectException(request: Request[_, _], cause: Exception) extends SttpClientException(request, cause)

  class ReadException(request: Request[_, _], cause: Exception) extends SttpClientException(request, cause)

  class TimeoutException(request: Request[_, _], cause: Exception) extends ReadException(request, cause)

  def adjustExceptions[F[_], T](
      monadError: MonadError[F]
  )(t: => F[T])(usingFn: Exception => Option[Exception]): F[T] = {
    monadError.handleError(t) { case e: Exception =>
      monadError.error(usingFn(e).getOrElse(e))
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy