【发布时间】:2015-02-24 20:42:40
【问题描述】:
我正在尝试编写代码,该代码在发生错误时传递给处理程序。
class Handler {
public: virtual void handle(std::exception const& e) = 0;
};
class DoIt {
Handler* handler;
public:
void doStuff() {
try {
methodThatMightThrow();
} catch (std::exception const& e) {
handler->handle(e);
}
}
void setHandler(Handler* h) { handler = h; }
void methodThatMightThrow();
}
不同的项目会使用这个类和不同的错误处理技术。
项目 1 记录错误
class Handler1: public Handler {
void handle(std::exception const& e) override {
logError(e.what());
}
};
项目 2 传播异常
class Handler2: public Handler {
void handle(std::exception const& e) override {
throw e;
}
};
这两个都应该有效。但是,如果异常是 std::exception 的子类,Handler2 将抛出异常的副本并丢失任何派生类信息,它几乎可以肯定是。
有没有很好的方法来重新抛出原始异常,甚至是相同类型的副本?
【问题讨论】: