想象一下,我有一份工作要做,可以通过三种不同的方式来完成:一种缓慢而痛苦的方式,但是故障安全的方式;中等程度的痛苦的方式,给你有Resource1
;和一个快速简单的方法,这需要Resource1
和Resource2
。现在,这些资源是珍贵的,所以我将它们包装成RAII-实施ResNHolder
S和写是这样的:RAII和构造函数中的异常
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
,因为它们是不可复制的。我做得太笨拙了吗?有没有其他聪明的方法来结构化函数?
我认为这很好。 – Nawaz
这可以作为try-catch的教科书示例。 –
我会使用工厂方法返回可选的对象而不是异常。 –
yngccc