Я пишу приложение для Windows на C ++ и столкнулся со следующей проблемой при работе с исключениями.
У меня есть базовый класс исключений, из которого происходят все остальные исключения. В базовом классе у меня есть метод для сообщения об ошибке любого исключения. Затем этот метод возвращает исключение (через '* this').
Теперь проблема возникает, когда я хочу расширить производное исключение, а затем использовать его в блоке перехвата. Поскольку метод extends объявлен в базовом классе, блок catch перехватывает базовый класс вместо производного класса. Есть ли способ обойти это так, чтобы вместо этого перехватывался правильный производный класс?
Вот код, иллюстрирующий проблему:
// DECLARATIONS
class BaseException {
BaseException() { }
Exception& extend( string message ) {
// extend message
return *this;
}
}
class DerivedException : public BaseException {
DerivedException() : Exception() { }
}
// RUNNING CODE
int main() {
try {
...
try {
...
// Something goes wrong
throw DerivedException( "message1" );
}
catch ( DerivedException& exc ) {
throw exc.extend( "message2" );
}
}
catch ( DerivedException& ) {
// Here is where I *want* to land
}
}
catch ( BaseException& ) {
// Here is where I *do* land
}
}
На данный момент я «решил» это, не , делающий метод расширения виртуальным, но объявив его в каждом исключении с правильным типом возвращаемого значения. Это работает, но это не красиво.