As a “note to self” about using ZIO 2, here are a few ZIO examples that show the ZIO.fail, ZIO.succeed, ZIO.attempt, orElseFail, and orDie methods and functions.
Before looking at the following code, it’s important to know that it uses the following Scala 3 enum:
enum FailureReason:
case NoCommandLineArgs, InvalidNumberOfArgs, InvalidIntForMinutes, InvalidIntForGain,
CouldNotCreateAudioStream, CouldNotCreateClip, CouldNotPlayClip
First, here’s an example of using ZIO.fail and ZIO.succeed:
def checkForZeroArgs(args: Chunk[String]): ZIO[Any, FailureReason, Unit] =
if args.size == 0 then ZIO.fail(NoCommandLineArgs) else ZIO.succeed(())
Here is ZIO.attempt and orElseFail:
def getMinutesToWait(args: Chunk[String]): ZIO[Any, FailureReason, Int] =
ZIO.attempt(args(0).toInt)
.orElseFail(InvalidIntForMinutes)
This function shows ZIO.attempt, orElseFail, and ZIO.succeed:
def getGainControl(args: Chunk[String]): ZIO[Any, FailureReason, Int] =
if args.size == 2 then
ZIO.attempt(args(1).toInt)
.orElseFail(InvalidIntForGain)
else
ZIO.succeed(DefaultGain)
ZIO’s orDie function
And last, this function shows how to use orDie:
def countdownEffect(minutesToWait: Int): ZIO[Any, Nothing, Unit] =
ZIO.foreachDiscard(1 to minutesToWait) { minute =>
ZIO.sleep(1.second) *>
printLine(s"time remaining: ${minutesToWait - minute} ...").orDie
}
Note that the error type in that function is Nothing. This is the way orDie works:
- It takes a ZIO effect that can fail with some error type.
- It returns a new ZIO effect that can’t fail — has
Nothingas its error type. - If the original effect succeeds,
orDiepasses through the success value. - If the original effect fails,
orDieconverts the failure into a defect, which typically results in the program crashing.
So basically a ZIO FAILURE is an exception you expect and want to handle (like handling an IOException), while a DEFECT is something you can’t control (like being unable to print to STDOUT, running out of memory, etc.). A defect will generally cause your application to crash/terminate.
In summary, if you’re interested in functional error handling with ZIO 2, I hope these examples are helpful.

