( geza42 | 2021. 03. 26., p – 17:12 )

Oké, lassan kezd leesni, köszi a türelmet. :)

Ennek örülök, nincsmit!

kivétel dobása alatt a destruktor is égnek tartja a bakancsot

Hát igen, a kérdés nagyon jó. Ha épp egy exception dobásának a kezelése folyik (hívódnak a dtorok), és egy új exception dobódik, akkor std::terminate() lesz a válasz. De csak akkor, ha ezt az új exceptiont nem kapja el egy azóta elindított try/catch block. Ha ez most nem teljesen tiszta, akkor hozom a példát. Tegyük fel, hogy a dtor így néz ki:

Valami::~Valami() {
  try {
    valamiFvAmiExceptiontDobhat();
  } catch (...) {
  }
}

És tegyük fel, hogy ez a Valami object le van téve valahova a stackre. Ha dobódik egy exception, akkor ugye végre fog hajtódni a Valami dtor-a. De ez is dobhat egy exceptiont (ha a valamiFvAmiExceptiontDobhat() dob egyet), miközben még az eredetileg dobott exception se kezelődött le. Tehát egyszerre 2 eldobott exception object is létezik. De ez ebben az esetben nem baj, mivel a valami-ben van try/catch, ami lekezeli ezt a második exceptiont. Tehát "nem jut ki" az exception a dtor-ból. Ezt csak a teljesség kedvéért mondtam el, sokan nincsenek ezzel az esettel tisztában. Tehát a teljes szabály bonyolultabb, mint hogy "exception dobás közben nem szabad másik exceptiont dobni".

Visszatérve, az std::terminate() pedig meghív egy user handlert, ami defaultból az std::abort()-ot hívja. Szóval csúnya vége lesz a történetnek. De amúgy felül lehet definiálni a terminate handlert. De mindenesetre ezért van az az ökölszabály, hogy dtor-ból ne dobjunk exceptiont. Ami egyébként szinte mindig betartható. Általában a resource-ok felszabadítása nem szokott hibával járni. De ha azzal is jár, általában sokat nem lehet tenni vele. Pl., nem annyira köztudott, hogy a "close()" is visszatérhet hibával, ami alkalomadtán network FS-en hibavesztéssel is járhat (elviekben). De sajnos sok mindent nem lehet vele kezdeni, max újra lehet írni a file-t.

elágazásos lekezelésnél egyértelmű, hogy mit csinál az ember, ha két hiba is bekövetkezik.

Egyetértek. Ahogy mondtam is korábban, a saját dolgaimban nem használok exceptionokat, mert igaziból nem szeretem, ill., nincs rá szükségem. De az out_of_mem kezelése kivételt képez, szóval ilyesmi durva esetekre szerintem jó eszköz lehet. Én teljes mértékben a visszatérési érték alapú hibakezelést preferálom, amivel tudom, hogy sokan nem értenek egyet, nem ez az elfogadott C++ körökben. De még senki se tudott meggyőzni arról, hogy az exceptionok jók az általános hibakezelésre (pedig amúgy nyitott lennék rá, csak a felhozott érveimre, kérdéseimre nem tudnak megnyugtató válaszokat adni). Szerintem több hátránya van, mint előnye. És ugye azért vannak az újabb nyelvek designerei között is olyanok, akik hasonlóan gondolkodhatnak. Se a go-ban, se a Rustban nincs az a klasszikus exceptionkezelés.