Video: Programmeren in 'kerststijl' anno 1979... 2024
Een C ++ -functie die lokaal bronnen toewijst, moet mogelijk een uitzondering vangen, enige bewerking uitvoeren en deze vervolgens opnieuw in de stapel stapelen. Beschouw het volgende voorbeeld:
void fileFunc () {ofstream * pOut = new ofstream ("File. Txt"); otherFunction (); delete pOut;}
Zoals veel programmeurs weten, wordt het geheugen dat door nieuw is toegewezen niet automatisch teruggestuurd naar de heap. Als otherFunction () een uitzondering zou genereren, zou de besturing het programma afsluiten zonder delete, aan te roepen en zou het geheugen dat aan het begin van fileFunc () is toegewezen verloren gaan.
Om dit probleem te voorkomen, kan fileFunc () een catch (…) bevatten om elke uitzondering te vangen:
void fileFunc () {ofstream * pOut = new ofstream ("File. Txt")); probeer {otherFunction (); delete pOut;} catch (…) {delete pOut; throw;}}
In deze frase retourneert fileFunc () het geheugen dat eerder aan de heap is toegewezen. Het is echter niet in staat om de rest van de uitzondering te verwerken, omdat deze geen idee heeft wat er mis zou kunnen zijn gegaan. Het weet niet eens welk type object het net heeft gevangen.
Het worp-sleutelwoord zonder argumenten voert het huidige uitzonderingsobject terug in de keten naar een functie die de fout goed kan verwerken.