There's also the option of doing it on an explicitly tagged union, Erlang-style: `something` returns not `Value` or `Either(Error, Value)` but `{ok, Value} | {error, Reason}`.
This means you can handle the error:
case something() of
{ok, Value} -> %%;
{error, Reason} -> %%
end
or you can "ignore" it
{ok, Value} = something()
but (and this is important) the latter *will not pass silently if `something()` returns an error.
Instead, it will raise a "BadMatch" fault, similar to an Haskell-ish
Obviously you would also want some syntactic sugar to make it look nice, but that's quite simple.