Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.baeldung.scala.zio.errorhandling

import zio.{Schedule, ZIO}

import java.io.IOException

object ErrorHandling {

private def stubbedResource(
isFail: Boolean = false
): ZIO[Any, IOException, String] = {
if (isFail) ZIO.fail(new IOException()) else ZIO.succeed("success")
}

def usingEither: ZIO[Any, Nothing, Either[IOException, String]] = {
stubbedResource().either
}

def usingOrElse: ZIO[Any, IOException, String] = {
stubbedResource(true).orElse(stubbedResource(false))
}

def usingCatchAll: ZIO[Any, IOException, String] = {
stubbedResource(true).catchAll(_ =>
for {
_ <- ZIO.logError("Some error occurred")
resource <- stubbedResource(false)
} yield resource
)
}

def usingCatchSome: ZIO[Any, IOException, String] = {
stubbedResource(true).catchSome { case _: IOException =>
ZIO.logError("Some error occurred")
stubbedResource(false)
}
}

def usingFold: ZIO[Any, Nothing, String] = {
stubbedResource(true).fold(
fail => "some default",
success => success
)
}

def usingFoldZIO: ZIO[Any, IOException, String] = {
stubbedResource(true).foldZIO(
fail => stubbedResource(false),
success => ZIO.succeed(success)
)
}

def usingRetry: ZIO[Any, IOException, String] = {
stubbedResource(true).retry(Schedule.recurs(3))
}

def usingRetryOrElse: ZIO[Any, IOException, String] = {
stubbedResource(true).retryOrElse(
Schedule.recurs(3),
(_, _: Long) => stubbedResource(false)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.baeldung.scala.zio.errorhandling

import zio.{Scope, ZIO}
import zio.test.{Spec, TestEnvironment, ZIOSpecDefault}
import zio.test._

object ErrorHandlingSpec extends ZIOSpecDefault {
val successResult = "success"
override def spec: Spec[TestEnvironment with Scope, Any] =
suite("ErrorHandlingSpec")(
test("usingEither returns Either of String") {
for {
result <- ErrorHandling.usingEither
} yield assertTrue(result == Right(successResult))
},
test("usingOrElse returns success") {
for {
result <- ErrorHandling.usingOrElse
} yield assertTrue(result == successResult)
},
test("usingCatchAll returns success") {
for {
result <- ErrorHandling.usingCatchAll
} yield assertTrue(result == successResult)
},
test("usingCatchSome returns success") {
for {
result <- ErrorHandling.usingCatchSome
} yield assertTrue(result == successResult)
},
test("usingFold returns default") {
for {
result <- ErrorHandling.usingFold
} yield assertTrue(result == "some default")
},
test("usingFoldZIO returns success") {
for {
result <- ErrorHandling.usingFoldZIO
} yield assertTrue(result == successResult)
},
test("usingRetry returns an IOException") {
val failureResult =
ErrorHandling.usingRetryOrElse.catchAll(ZIO.succeed(_))
for {
error <- failureResult
} yield assertTrue(error == error)
},
test("usingRetryOrElse returns success") {
for {
result <- ErrorHandling.usingRetryOrElse
} yield assertTrue(result == successResult)
}
)
}