想象一下,我有一份工作要做,可以通過三種不同的方式來完成:一種緩慢而痛苦的方式,但是故障安全的方式;中等程度的痛苦的方式,給你有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