Sobes.tech
Junior — Middle

W którym momencie użycie operatora throw wewnątrz destruktora stanie się niedozwolone?

sobes.tech AI

Odpowiedź od AI

Użycie operatora throw (w C++ — throw) wewnątrz destruktora staje się niedozwolone, jeśli destruktor jest wywoływany podczas obsługi innego wyjątku. W takim przypadku wyrzucenie nowego wyjątku spowoduje wywołanie std::terminate(), co zakończy program.

Inaczej mówiąc, jeśli destruktor jest wywoływany podczas propagacji wyjątku (np. podczas wychodzenia z bloku try), nie można wyrzucać wyjątków z destruktora. Aby tego uniknąć, zazwyczaj łapie się wszystkie wyjątki w destruktorze i nie pozwala się im wyjść na zewnątrz.

Przykład bezpiecznego destruktora:

~MyClass() {
    try {
        // kod, który może wyrzucić wyjątek
    } catch (...) {
        // obsługa lub logowanie, ale nie wyrzucamy wyjątku
    }
}