You need to learn more languages. &quot;Checked exception&quot; is highly Java-specific and it is biasing your understanding.<p>A checked exception is okay but it is still an exception with all the stack frame capturing overhead that brings.<p>In better languages like ML variants (say F#) we have discriminated unions. These let us return structured, type safe, result codes and information. Without all the overhead and OO-ness of nasty exceptions. We can still throw exceptions but these are strictly, and I mean strictly, for those very exceptional and unexpected scenarios.