I think this article sums it up.
Arguments for Using Exceptions
- Exceptions separate error-handling code from the normal program flow and thus make the code more readable, robust and extensible.
- Throwing an exception is the only clean way to report an error from a constructor.
- Exceptions are hard to ignore, unlike error codes.
- Exceptions are easily propagated from deeply nested functions.
- Exceptions can be, and often are, user defined types that carry much more information than an error code.
- Exception objects are matched to the handlers by using the type system.
Arguments against Using Exceptions
- Exceptions break code structure by creating multiple invisible exit points that make code hard to read and inspect.
- Exceptions easily lead to resource leaks, especially in a language that has no built-in garbage collector and finally blocks.
- Learning to write exception safe code is hard.
- Exceptions are expensive and break the promise to pay only for what we use.
- Exceptions are hard to introduce to legacy code.
- Exceptions are easily abused for performing tasks that belong to normal program flow.