given a function fn that can fail, it will return a result and an error e.g.
result, error = fn(...)
calling this function should yield to the caller two possibilities, somehow: a success value _or_ a failure error
the important thing is that in both cases, the control flow is visible in the source code as written
result, error = fn(...)
if there was an error, ...
if it was successful, ...
when an expression fails, you want to see the consequence in-line
the success path and the failure path are equally important