Két észrevétel:
- Itt az
errorlabel alatt látszania kell az összes
eroforrasKváltozónak.
- Nevezett
eroforrasKváltozókat a függvény elején mind valamilyen érvénytelen értékre kell inicializálni, ugyanis a hibakezelő kódra ráugorhatunk már azelőtt is, hogy az adott erőforrást egyáltalán megpróbáltuk volna inicializálni. Vagyis ha a felépítés során hiba keletkezik és ugrunk, akkor eldobjuk a meglévő scope-ot, és az érvénytelen init értékekre hagyatkozva állítjuk elő újra ezt az információt (több, egymástól független if-fel).
Ez azonban valóban csak ízlés kérdése, és nem vitatom, hogy a fenti szerkezet nagyon robusztus tud lenni; másoktól is olvastam, hogy bevált számukra.
Ennek a "kisimított" if-es lebontásnak egyébként van egy olyan előnye, hogy a felépítés közbeni ownership transfer-t nagyon rugalmasan kezeli. Például valahonnal előrántunk egy új fd-t (
open(),
socket(),
pipe()stb.), erre ráültetünk egy stdio stream-et
fdopen()-nel, plusz az eredeti fd-t -1-re állítjuk. A kilapított hibakezelő rész "ingyen" adja a függetlenséget, extra erőfeszítés nélkül tudja vizsgálni, hogy most
close(fd)vagy
fclose(strm)kell-e (vagy egyik se).