So usually when we run a method that can both fail and return a value, we can encode our method return type as Either[SomeErrorType, ReturnType]
. But many times
I use Try[Unit]
for that case.
It encodes that the result of the method either succeeds or fails with some Exception
, which can be further processed.
T => Unit
Try
lifts errors to the application level, encoding in the signature that some error can be expected and allowing the application to handle it as a value. Option[T]
=> Option is only able to encode that the operation had a value or notEither[SomeErrorType, Unit]
=> Try
It's easier to work with using monadic constructions. I've used something like this to implement checks. (imaginary example)
for {
entity <- receiveEntity // Try[Entity]
_ <- isRelational(entity)
_ <- isComplete(entity)
_ <- isStable(entity)
} yield entity
where each check is of the form: Entity => Try[Unit]
This will return the entity
if all checks pass of the first error that failed the check.