In my experience if I use exceptions to "smartly" recover the exception handling tends to over time become more and more complex when it finally adds way too much overhead compared to value. Instead I have adopted the approach of using exceptions purely for detection, having an exception thrown in a function and logging it at that point allows me to faster find ev. problems. Using hierarchies where you rethrow the exception to capture it in a higher level well I tried that but find it makes the code unnecessarily difficult to follow without a major benefit.