Представьте, что у меня есть работа, которую можно выполнить тремя способами: медленным и болезненным, но безотказным способом; путь с умеренными страданиями, учитывая, что у вас есть Resource1
; и быстрый и простой способ, который требует как Resource1
, так и Resource2
. Теперь эти ресурсы являются ценными, так что я оберните их в RAII реализующее ResNHolder
с и написать что-то вроде этого: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
, потому что они не являются копируемыми. Я делаю это слишком неуклюже? Есть ли другой умный способ структурирования функции?
I думаю, что это нормально. – Nawaz
Это может быть sub как пример учебника для try-catch. –
Я бы использовал фабричный метод, который вместо необязательного объекта возвращает объект. –
yngccc