An exception should be used when you encounter an error situation that you do not know how to resolve immediately. If you know how to resolve it within the stack immediately, it is not appropriate to throw an exception to handle it, you should just handle it.
My bad, I ment that I consider it a bad design choice to have a deep-nested exception being thrown and caught by something so far up the heirarchy [based on what I was saying... I just sort of ran off! lol]. Like say Stack 4 raising an exception where Stack 1 would catch it. It can cause unpredictable results, exceptions are just that - an exception. Personally I prefer the exception to resolve itself within the stack immediately
So, if you're using exceptions properly, they're more likely to be handled farther up in the stack. I have no qualms about throwing exceptions where I need to but I rarely have a catch clause outside of main(). Not never, but quite rarely. A graceful shutdown with some sort of explanatory error message in a log is always better than a mystery segfault.