Sobes.tech
Junior — Middle

Millal muutub throw operaatori kasutamine destruktoris sees vastuvõetamatuks?

sobes.tech AI

Vastus AI-lt

Kasutades operaatorit throw (C++-s — throw) destruktoris muutub vastuvõetamatuks, kui destruktor kutsutakse teise erandi töötlemise ajal. Sellisel juhul põhjustab uue erandi viskamine std::terminate() kutsumise, mis lõpetab programmi.

Teisisõnu, kui destruktor kutsutakse erandi levitamise ajal (näiteks try ploki väljumisel), ei tohi sealt erandeid visata. Selle vältimiseks püütakse tavaliselt kõik erandid destruktoris kinni ja neile ei lasta väljuda.

Turvalise destruktori näide:

~MyClass() {
    try {
        // kood, mis võib visata erandi
    } catch (...) {
        // töötlemine või logimine, kuid mitte erandi viskamine
    }
}