Stellen Sie sich vor, ich hätte eine Aufgabe, die auf drei verschiedene Arten erledigt werden kann: eine langsame und schmerzhafte, aber ausfallsichere Art; der Weg mit mäßigem Leiden, vorausgesetzt, Sie haben Resource1
; und ein schneller und einfacher Weg, der sowohl Resource1
als auch Resource2
erfordert. Nun sind diese Ressourcen wertvoll, damit ich sie einpacken in RAH-Implementierung ResNHolder
s und schreiben dies so etwas wie:RAII und Ausnahme im Konstruktor
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()“ nehmen Hinweise auf Logger
/ResNHolder
, denn sie sind nicht kopierbar. Tue ich es zu ungeschickt? Gibt es eine andere clevere Möglichkeit, die Funktion zu strukturieren?
I denke, das ist in Ordnung. – Nawaz
Dies könnte sub-als ein Lehrbuch Beispiel für Try-Catch. –
Ich würde eine Factory-Methode verwenden, die ein optionales Objekt anstelle der Ausnahme zurückgibt. –
yngccc