Najpierw 2. Po pierwsze lapiemy wyjatek w konstruktorze, w ktorym jest szansa, ze poleci. W zwiazku z tym zawsze mamy dostep do tych skladowych, ktore alokowane sa dynamicznie. Czyli nigdy nie powstanie "obiekt bez zycia", jak to sie chyba nazywa.
A ogolnie. Jesli juz sprawdzamy czy jest pamiec - co z mojej praktyki jest raczej dosc rzadkie - to znaczy, ze szansa jest i zalezy nam na tym, zeby obsluzyc to prawidlowo. Mozemy wtedy pozwalniac te do tej pory zarezerwowane, wyczyscic niejako obiekt i ustawic jakas flage oznaczajaca, ze obiekt jest zepsuty. Pozniej albo sprawdzac ta flage zewnatrz albo w kazdej metodzie rzucac wyjatek w przypadku proby wykonania operacji na obiekcie zepsutym.
Tak ja bym polecal na podstawie tych zalozen:
- nie chcemy dopuscic do powstania obiektu martwego, wiec konstruktor nie moze rzucic wyjatku
- obiekt inicjujacy powinien zwalniac swoje zasoby
- metody moga rzucac wyjatki i pozostawiamy wywolujacemu decyzje, co w takiej sytuacji zrobic (np. logika zdecyduje sie poinformowac GUI o koniecznosci pokazania komunikatu uzytkownikowi)