Существует множество мест, где можно найти рекомендации по разработке классов исключений. Почти везде я смотрю, этот список объектов исключений никогда не должен делать, что влияет на дизайн этих классов.
Например, Boost люди рекомендуют, чтобы класс не содержал элементов std::string
, потому что их конструктор мог бы выбросить, что вызовет запуск -time, чтобы немедленно завершить программу.
Теперь мне кажется, что это довольно теоретически. Если конструктор std::string
бросает, это либо ошибка (я передал нулевой указатель), либо условие отсутствия памяти (исправьте меня, если я ошибаюсь здесь). Поскольку я нахожусь на рабочем столе, я просто притворяюсь, что у меня бесконечное количество памяти, а исчерпание памяти является фатальным для моего приложения независимо от того, что.
С учетом этого, почему я не должен вставлять объекты std::string
в мои классы исключений? Фактически, почему мои классы исключений не могут быть полнофункциональными, а также заботиться о регистрации, трассировке стека и т.д. Я знаю принцип единой ответственности, и мне кажется, что это справедливый компромисс чтобы класс исключения выполнял все это. Конечно, если мой парсер должен сообщить о синтаксической ошибке, полнофункциональное исключение было бы более полезным, чем исключение, построенное вокруг статически выделенного массива символов.
Итак: худые классы исключений С++ - насколько велика сделка в реальном мире? Каковы компромиссы? Есть ли хорошие дискуссии по этой теме?