Как лучше применять исключения в программах использующих ООП на C++ (и стоит ли применять их вообще)?
Сейчас пытаюсь написать маленькую программку с использованием исключений, но пока получается как-то кривовато...
Вот например есть три клсса: Foo, Boo и Bar, которые соответственно могут выбрасывать исключения EFoo, EBoo =) и EBar (и наследованные от них). Причём экземпляр класса Bar используется и внутри Foo и внутри Boo. Что делать когда Bar выкидывает исключение EBar? Foo и Boo должны свободно пропускать его вниз по стеку вызовов или же перехватывать и как-то отображать на EFoo и EBoo? В первом случае (пропускаем) появляется проблема - как вызывающая функция определит, из какого класса выпало исключение - Foo или Boo? Во втором случае (вылавливаем и выкидывам своё исключение) появляется сразу две проблемы - 1) куча лишних перехватов исключений, ведь кроме EBar у нас есть std::exception и возможно какие-то другие исключения других классов библиотек, которые тоже придётся перехватывать; 2) как именно отображать EBar на EFoo/EBoo чтобы сохранилась вся или хотябы основная часть исходной информации: хранить копию EBar в новом исключении, сделать новую дочернюю иерархию от EFoo/EBoo которая бы отражала смысл ошибок EBar или как-то ещё? Можно вообще отказаться от исключений и перейти на return-коды. Но и тут появляется куча проблем: 1) иногда функции при нормальной работе могут вернуть почти всё что угодно и для детализации ошибки придётся городить что-то типа errno/GetLastErrorCode; 2) неявное игнорирование ошибок, что тоже не сильно хорошо; 3) если нужно тщательно проверять ошибки после каждого вызова функции (в каких-нибудь сильно важных учатсках кода например), то код вообще распухает до ниипических размеров, причём в отличие от исключений, где код обработки ошибок явно отделяется от нормального кода, тут он будет равномерно размазан по всему телу функции; 4) сложно группировать сходные по смыслу ошибки (например ошибки ФС отдельно, сеть - отдельно), с исключениями это делается с помощью наследования и можно в catch удобно отделять мух от котлет.
Интересует мнение опытных программистов по этому поводу, буду рад полезным ссылкам и литературе по теме. Также хочется посмотреть исходники каких-нибудь opensource проектов на C++/OOP с использованием исключений и других способов обработки ошибок (подскажите названия, а то я потыкался в гугль, но ничего толкового не нашёл =().
Вопросы производительности меня не интересуют (по крайней мере сейчас).
З.Ы. Высеры типа "C++ говно, ObjectXLAM рулит" будут проигнорированы, так что не тратьте пожалуйста на это своё и моё время =).