The biggest problem with that is that it is very unwieldly if you're using any kind of higher-order functions.
To fix that, you need to start supporting error polymorphism. For example, `map` should have a signature like
map :: List a -> (a -> b -[err]) -> List b -[err]
So that map [1 2 3] +1 //no errors
map [1 2 3] sendOnNetwork //returns NetworkError
At least, this is one of the major limitation of Java's Checked Exceptions idea, one which often forces you to use Unchecked Exceptions.Another common problem is handling exceptions which occur while handling another exception. D has the best default I've seen in that area (it will automatically collect all of the errors, instead of panic()-ing like C++ or discarding the old exception like Java and C#).