I have to say though that I prefer a functional approach w/ Either/Result<T,E> over Exceptions now that I've done both. With both you can choose to ignore an exception and have it "pass" up to a higher level, but the functional approach is more specific - with Exceptions and how they are implemented in most languages you have to look @ the source code to see what exception(s) could be thrown.