I think, it is a very good rule to choose whether function can be tuple-return or throw-return: if it has to work with outside world, than let is return {ok, Value} | {error, Reason} if it is "clean", than return Value or throw error is ok.