Вы запутались, потому что в каждом из ваших классов исключений есть два базовых класса типа std::exception
.Попробуйте поймать const std::exception&
и посмотрите, как компилятор жалуется.
Фактическая проблема, с которой вы здесь сталкиваетесь, заключается в том, что код явно инициализирует одну из этих баз, но по умолчанию инициализирует другую;предложение catch получает объект FooException
, инициализированный по умолчанию std::exception
, так что это сообщение, которое вы получаете.
Как подсказали некоторые комментарии, это сложная иерархия классов, и естьне так много вы можете сделать, чтобы решить проблему.Чтобы не иметь нескольких копий std::exception
, вам нужно наследовать фактически от std::exception
в двух местах, где он используется.Наследование в FooException
легко изменить, но вы не можете изменить тот факт, что std::runtime_exception
не является производным от std::exception
.
Таким образом, существует проблема проектирования, и вы должны точно решить, чтоВы хотите предоставить пользователю.Эта иерархия делает больше, чем вы описываете в своем вопросе, поскольку она обеспечивает и FooException
и части стандартной иерархии исключений.Выберите один: либо используйте стандартную иерархию исключений, либо используйте собственную иерархию исключений, при этом FooException
происходит от std::exception
и предоставляет конструктор, который инициализирует подобъект std::exception
.