Рассмотрим Википедию
http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D0%B8%D1%81%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B9Цитата:
Достоинства использования исключений особенно заметно проявляется при разработке библиотек процедур и программных компонентов, ориентированных на массовое использование. В таких случаях разработчик часто не знает, как именно должна обрабатываться исключительная ситуация (при написании универсальной процедуры чтения из файла невозможно заранее предусмотреть реакцию на ошибку, так как эта реакция зависит от использующей процедуру программы), но ему это и не нужно — достаточно сгенерировать исключение, обработчик которого предоставляется реализовать пользователю компонента или процедуры. Единственная альтернатива исключениям в таких случаях — возврат кодов ошибок, которые вынужденно передаются по цепочке между несколькими уровнями программы, пока не доберутся до места обработки, загромождая код и снижая его понятность.
Использование исключений в целях контроля ошибок повышает читаемость кода, так как позволяет отделить обработку ошибок от самого алгоритма, и облегчает программирование и использование компонентов других разработчиков.
...
Итак, достоинство:
1. В том, что вместо того, чтобы обработать ошибку на месте программист (ссылаясь на незнание мотивов другого программиста) перекладывает обработку на плечи "потомка" (отмазка). (При этом ссылаются на процедуру чтения из файла. Всё что нужно знать при чтении из файла, так это прочитаны данные - всё хорошо, или не прочитаны - есть ошибка. Можно, конечно, используя код ошибки передавать причину неудачи: отсутствует файл, занят другим ресурсом и т.п., но как правило для родительской программы это не важно).
2. Безусловно, читаемость кода возрастает, поскольку сразу виден опасный участок и его обработка, но это преимущество сомнительное, так как если есть проверка критических значений, то и обработка просматривается лучше. (См. мой пример со скрытой опечаткой, которую нашли исключительно благодаря безисключительному
методу).
3. Облегчает программирование - опять отмазка.
"Что бы мне такое делать, чтобы ничего не делать" (с)
Цитата:
...
Недостаток исключений — в том, что их поддержка снижает скорость работы программы. Поэтому в местах программы, критичных по скорости, не рекомендуют возбуждать и обрабатывать исключения, хотя следует отметить, что в реальности такие случаи крайне редки, во всяком случае, в прикладном программировании.
Также в сложных программах возникают большие «нагромождения» операторов try ... finally и try ... catch (try ... except).
Недостаток со снижением скорости работы я бы назвал спорным, потому что проверка условий тоже снижает скорость работы программы, однако код поддержки механизма исключений сам по себе источник опасности (ошибок и т.п.), плюс может быть реализован неэффективно, что приведёт к значительному снижению производительности по отношению к проверкам.
На счёт больших нагромождений у меня есть подозрения, что порождения программистов недоучек, которые не могут грамотно развести исключения. Обычно стремятся отложить проверку исключений на потом, а потом в одном месте все их обработать. Без конкретного примера коментировать очень сложно.
Таким образом: имеем сомнительную пользу при явных недостатках.