Video: From C to Python by Ross Rheingans-Yoo 2024
En C ++-funktion som allokerar resurser lokalt kan behöva få ett undantag, göra lite bearbetning och sedan hämta den upp i stapelkedjan. Tänk på följande exempel:
void fileFunc () {ofstream * pOut = newstream ("File. Txt"); otherFunction (); ta bort pOut;}
Så många programmerare vet att det minne som allokeras av nya inte returneras automatiskt till högen. Om otherFunction () skulle göra ett undantag skulle kontrollen avsluta programmet utan att påberopa delete, och minnet som tilldelades i början av filenFunc () skulle gå vilse.
För att undvika detta problem kan fileFunc () innehålla en fångst (…) för att fånga något undantag som kastas:
void fileFunc () {ofstream * pOut = newstream ("File. Txt"); prova {otherFunction (); ta bort pOut;} fånga (…) {ta bort pOut; kasta;}}
Inom denna fras returnerar fileFunc () det minne som allokerades tidigare till högen. Det är emellertid inte i stånd att behandla resten av undantaget eftersom det inte har någon aning om vad som kunde ha gått fel. Det vet inte ens vilken typ av objekt det bara fångat.
Kasta sökordet utan argument rethrows det nuvarande undantagsläget säkerhetskopiera kedjan till någon funktion som kan ordentligt behandla felet.