С точки зрения ОО это не разумно. Поскольку вы говорите, что DerivedException
- это BaseException
, его возможные причины должны быть подмножеством из BaseException
, а не надмножеством. В противном случае вы в конечном итоге нарушите принцип замены Лискова .
Более того, поскольку перечисления C ++ не являются классами, их нельзя расширять или наследовать. Вы можете определить дополнительные причины в отдельном перечислении в DerivedException
, но затем вы столкнетесь с той же проблемой, описанной выше:
class DerivedException : public BaseException
{
enum {
SOME_OTHER_REASON = THAT_REASON + 256, // allow extensions in the base enum
AND_ANOTHER_REASON
};
...
};
...
try {
...
} catch (BaseException& ex) {
if (ex.getReason() == BaseException::THIS_REASON)
...
else if (ex.getReason() == BaseException::THAT_REASON)
...
else if (ex.getReason() == ??? what to test for here ???)
...
}
Вместо этого вы можете определить отдельный подкласс исключений для каждой отдельной причины. Тогда вы можете обращаться с ними полиморфно (если нужно). Это подход стандартной библиотеки C ++, а также других библиотек классов. Таким образом, вы придерживаетесь соглашений, что облегчает понимание вашего кода.