这很大程度上取决于这些功能是什么。考虑到您的应用程序,我将继续假设您要添加的函数是用来处理其他错误类型的。
为了简单起见,我们假设每个函数(我们称之为handle
)只是传递一个错误对象,它会分析并处理或不处理该错误对象。它返回一个bool
来表明这一点。
然后你可以得到以下(简化的)error_handler
class:
class error_handler {
public:
using handler_t = bool (*)(error const&);
std::vector<handler_t> handlers;
// …
void add_handler(handler_t handler) {
handlers.push_back(handler);
}
void handle_error(error const& error) {
for (auto const& handler : handlers)
if (handler(error))
break;
}
};
这是假设您的错误由类的实例表示error
(并且您使用的是 C++11 – 语法略有变化)。
现在,这个类的定义是fixed。您可以添加在其他文件中定义的其他处理程序,只需调用 add_handler`。下面是两个例子:
// Simple logging “handler”. Needs to be added first!
extern error_handler global_error_handler;
bool log_handler(error const& error) {
std::cerr << error.message() << '\n';
return false; // We only log, we don’t handle.
}
global_error_handler.add_handler(log_handler);
// Handler for missing dog food
extern error_handler global_error_handler;
errno_t const MISSING_DOG_FOOD = 42;
bool dog_food_missing(error const& error) {
if (error.code() != MISSING_DOG_FOOD)
return false;
global_dog_food_container.add(some_food());
return true;
}
global_error_handler.add_handler(dog_food_missing);