【发布时间】:2021-07-20 06:30:29
【问题描述】:
考虑一个类foo,它具有一个或多个函数,可以通过记录器或在未提供记录器时抛出异常来报告失败:
struct logger
{
// ...
};
struct foo
{
void set_logger(std::shared_ptr<logger> logger) { m_logger = std::move(logger); }
bool bar(const std::filesystem::path& path)
{
// Check path validity
if (not std::filesystem::exists(path) {
if (m_logger) {
m_logger->warn("path does not exist.");
return false;
}
else {
throw std::runtime_error("path does not exists.");
}
}
// Some random operation
try {
// Do something here that might throw
}
catch (const std::exception& e) {
if (m_logger) {
m_logger->warn("operation bar failed.");
return false;
}
else {
throw e;
}
}
return true;
}
private:
std::shared_ptr<logger> m_logger;
};
这不仅看起来难看,而且极易出错,并且随着更多功能添加到foo 代码将是重复的。
是否有任何模式或范式可以将这种逻辑抽象出来?当需要错误报告时,我可以构造某种包装模板以在 foo 的各种函数中使用?
任何达到 C++20 的都可以接受。
【问题讨论】: