【发布时间】:2013-10-01 08:34:54
【问题描述】:
想象我有一份工作要做,可以通过三种不同的方式来完成:一种缓慢而痛苦但安全可靠的方式;中度痛苦的方式,假设你有Resource1;还有一种快速简便的方法,它需要Resource1 和Resource2。现在,这些资源很宝贵,所以我将它们包装到实现 RAII 的 ResNHolders 中并编写如下内容:
void DoTheJob(Logger& log/*, some other params */) {
try {
Res1Holder r1(/* arguments for creating resource #1 */);
try {
Res2Holder r2(/* arguments */);
DoTheJobQuicklyAndEasily(log, r1, r2);
}
catch (Res2InitializationException& e) {
log.log("Can't obtain resource 2, that'll slowdown us a bit");
DoTheJobWithModerateSuffering(log, r1);
}
}
catch (Res1InitializationException& e) {
log.log("Can't obtain resource 1, using fallback");
DoTheJobTheSlowAndPainfulWay(log);
}
}
“DoTheJobXxx()”引用Logger/ResNHolder,因为它们是不可复制的。是我做得太笨了吗?有没有其他巧妙的方法来构造函数?
【问题讨论】:
-
我觉得没问题。
-
这可以作为 try-catch 的教科书示例。
-
我会使用返回可选
对象而不是异常的工厂方法。 -
这里面的函数名棒极了。