Я хочу вызвать функцию, которая может вызвать исключение.Если оно вызывает исключение, я хочу поймать его и передать объект исключения в функцию-обработчик.Реализация функции-обработчика по умолчанию - просто выбросить исключение.Вот сокращенный код, иллюстрирующий проблему:
struct base_exception : exception {
char const* what() const throw() { return "base_exception"; }
};
struct derived_exception : base_exception {
char const* what() const throw() { return "derived_exception"; }
};
void exception_handler( base_exception const &e ) {
throw e; // always throws a base_exception object even if e is a derived_exception
}
int main() {
try {
throw derived_exception();
}
catch ( base_exception const &e ) {
try {
cout << e.what() << endl; // prints "derived_exception" as expected
exception_handler( e );
}
catch ( base_exception const &e ) {
cout << e.what() << endl; // prints "base_exception" due to object slicing
}
}
}
Однако throw e
в exception_handler()
создает копию статического типа исключения, то есть base_exception
.Как я могу заставить exception_handler()
выдать фактическое исключение, имеющее правильный тип времени выполнения derived_exception
?Или как мне изменить дизайн, чтобы получить то, что я хочу?