Я создал собственный класс исключений, который наследуется от std :: exception.
#include <iostream>
class Exception : std::exception {
public:
const char* what() const noexcept override {
return "test";
}
};
int main() {
try {
throw Exception();
} catch (std::exception& e) {
std::cout << e.what() << std::endl;
}
}
Эта программа, скомпилированная g ++ -stdc ++ = 17 в Ubuntu, приводит к тому, что исключение не перехватывается блоком catch, даже если предполагается, что перехват по ссылке также перехватывает производные исключения. Он вызывает std :: terminate, даже если это происходит в блоке try, который перехватывает свой базовый класс по ссылке. То же самое происходит, если Exception наследуется от std :: runtime_error и передает «тест» конструктору std :: runtime_error в своем собственном конструкторе. Обычно решение состоит в том, чтобы перехватывать только с использованием Exception, но в моем исходном коде мне нужно отлавливать различные типы исключений, которые все наследуются от std :: exception. Почему это происходит? Не работает ли отлов по ссылке на базу? Как я могу перехватить все исключения, происходящие из std :: exception, используя один блок catch?