catch
действительно не обязательно нужен точный тип.
Обычной и эффективной практикой является использование исключений, полученных из std::exception
(встречается в <stdexcept>
). Причина заключается в том, что вы можете полиморфно ловить, то есть вам не нужно знать точный тип (см. Также Разница: std :: runtime_error vs std :: exception () ) и что у нас есть соглашение, чтобы справиться с этим.
Либо вы используете одну из тех, что предусмотрены стандартом (например, std::range_error
), либо, если вас не устраивает [достаточно], специализация std::exception
:
#include <stdexcept>
class moores_law_stopped : public std::exception {
public:
virtual ~moores_law_stopped() throw() {}
virtual const char *what() const throw() {
return "moores law stopped. duck under your table.";
}
};
#include <iostream>
int main () {
try {
throw moores_law_stopped();
} catch (std::exception const &e) {
std::cerr << "oh oh: " << e.what() << std::endl;
}
}
Выход:
oh oh: moores law stopped. duck under your table.
Соглашение заключается в отлове по ссылке или константной ссылке, так что вы получаете полиморфное поведение, не опасаясь нарезки объектов .