У меня есть две функции a()
и b()
, которые имеющие собственные классы исключений (последовательно a_exc
и b_exc
), наследуемых от std::logic_error
.Вызов метода из собственного класса исключения поймала его базового класса
void a() { (...) throw a_exc(some_val) }
void b() { (...) throw b_exc(some_val) }
class a_exc : public std::logic_error
{
private:
int foo;
public:
a_exc(int val, const std::string& what_msg="Msg.")
: std::logic_error(what_msg), foo(val) {}
void show() { //show foo }
}
class b_exc : public std::logic_error
{
private:
std::string bar;
public:
a_exc(std::string val, const std::string& what_msg="Msg.")
: std::logic_error(what_msg), bar(val) {}
void show() { //show bar }
}
Допустим, я следующая часть кода:
try {
a();
b();
}
catch (const std::logic_error& e)
{
e.what();
// e.show();
}
catch (const std::logic_error& e)
уловы как a_exc
и b_exc
. Конечно, этот блок не может использовать e.show()
, потому что пойманный obj равен std::logic_error
.
И вот моя проблема. Интересно, есть ли вероятность называть метод show()
в std::logic_error
catch catch, когда исключено исключение, было a_exc
или b_exc
. Я знаю, что вызов show()
возможен, если я создаю отдельные блоки catch для a_exc
и b_exc
, но я хочу назвать этот метод с помощью только один блок catch. Является ли это возможным?
То, что вы хотите, - это шаблонный улов, и он так же редко встречается (= в настоящее время несуществующая библиотека w/oa), как шаблонные виртуальные машины. – lorro