Skip to content

Commit

Permalink
Handle errors in finalizers
Browse files Browse the repository at this point in the history
  • Loading branch information
adamw committed Jan 24, 2025
1 parent 47dda50 commit 0eb74d1
Show file tree
Hide file tree
Showing 6 changed files with 9 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ class HttpClientFutureBackend private (

override protected def ensureOnAbnormal[T](effect: Future[T])(finalizer: => Future[Unit]): Future[T] =
effect.recoverWith { case e =>
finalizer.flatMap(_ => Future.failed(e))
finalizer.flatMap(_ => Future.failed(e)).recoverWith { case e2 => e.addSuppressed(e2); Future.failed(e) }
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ class HttpClientCatsBackend[F[_]: Async] private (

override protected def ensureOnAbnormal[T](effect: F[T])(finalizer: => F[Unit]): F[T] =
Async[F].guaranteeCase(effect) { outcome =>
if (outcome.isSuccess) Async[F].unit else finalizer
if (outcome.isSuccess) Async[F].unit else Async[F].onError(finalizer)(t => Async[F].delay(t.printStackTrace()))
}

override protected def emptyBody(): InputStream = emptyInputStream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ class HttpClientFs2Backend[F[_]: ConcurrentEffect: ContextShift] private (

override protected def ensureOnAbnormal[T](effect: F[T])(finalizer: => F[Unit]): F[T] =
ConcurrentEffect[F].guaranteeCase(effect) { exitCase =>
if (exitCase == ExitCase.Completed) ConcurrentEffect[F].unit else finalizer
if (exitCase == ExitCase.Completed) ConcurrentEffect[F].unit
else ConcurrentEffect[F].onError(finalizer)(t => ConcurrentEffect[F].delay(t.printStackTrace()))
}

override protected def emptyBody(): Stream[F, Byte] = Stream.empty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ class HttpClientFs2Backend[F[_]: Async] private (

override protected def ensureOnAbnormal[T](effect: F[T])(finalizer: => F[Unit]): F[T] =
Async[F].guaranteeCase(effect) { outcome =>
if (outcome.isSuccess) Async[F].unit else finalizer
if (outcome.isSuccess) Async[F].unit else Async[F].onError(finalizer)(t => Async[F].delay(t.printStackTrace()))
}

override protected def emptyBody(): Stream[F, Byte] = Stream.empty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,9 @@ class HttpClientMonixBackend private (
override protected def cancelLowLevelBody(p: Publisher[ju.List[ByteBuffer]]): Unit = cancelPublisher(p)

override protected def ensureOnAbnormal[T](effect: Task[T])(finalizer: => Task[Unit]): Task[T] =
effect.guaranteeCase { exit => if (exit == ExitCase.Completed) Task.unit else finalizer }
effect.guaranteeCase { exit =>
if (exit == ExitCase.Completed) Task.unit else finalizer.onErrorHandleWith(t => Task.eval(t.printStackTrace()))
}

override protected def emptyBody(): Observable[Array[Byte]] = Observable.empty

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class HttpClientZioBackend private (

override protected def ensureOnAbnormal[T](effect: Task[T])(finalizer: => Task[Unit]): Task[T] = effect.onExit {
exit =>
if (exit.succeeded) ZIO.unit else finalizer.orDie
if (exit.succeeded) ZIO.unit else finalizer.catchAll(t => ZIO.effect(t.printStackTrace()).orDie)
}.resurrect

override protected val bodyToHttpClient: BodyToHttpClient[Task, ZioStreams, R] =
Expand Down

0 comments on commit 0eb74d1

Please sign in to comment.