Esistono diversi malintesi alla base della tua domanda.
Prima di tutto, la distinzione che si ottiene tra la restituzione dei dati o un codice di errore è una distinzione artificiale. I linguaggi C e C ++ non hanno questa distinzione. Per loro si restituiscono sempre i dati. Solo noi programmatori associamo il significato di un codice di errore ad alcuni di quei dati.
In secondo luogo, quando si esce da una funzione, non è necessario tornare indietro nel punto in cui è stata chiamata la funzione. Puoi finire in una posizione completamente diversa del codice.
Ora, le eccezioni possono essere implementate in vari modi. Traccerò uno di questi modi. Non è il più efficiente, ma è uno dei più facili da capire.
Per prima cosa spiegherò come funziona una chiamata di funzione normale. Quando si chiama una funzione nel codice C o C ++, il compilatore genera istruzioni per eseguire diversi passaggi. Prima i (valori di) gli argomenti della funzione vengono inseriti nello stack. Quindi viene inviato l'indirizzo dove continuare l'elaborazione dopo il ritorno della funzione (con un ritorno normale). Infine, un salto viene eseguito alla prima istruzione della funzione.
Per la gestione delle eccezioni, il compilatore genera alcune informazioni aggiuntive che vengono inserite nello stack insieme alle variabili locali. Questa informazione dice all'istruzione throw
come pulire quelle variabili locali e dove si trovano i blocchi catch
.
Quando viene generata un'eccezione, l'istruzione throw
cammina sopra lo stack per cercare un blocco catch
appropriato, pulendo le variabili locali che trova lungo il percorso. Quando è stato trovato un blocco catch
appropriato, viene eseguito un salto per continuare l'esecuzione in quel punto.
Come puoi vedere, il ritorno da una funzione e il lancio di un'eccezione utilizzano informazioni completamente diverse su dove continuare l'esecuzione dopo il ritorno / lancio. Per questo motivo, se una funzione non indica errori con un codice di errore, ma utilizza eccezioni, è possibile presumere che la funzione abbia avuto successo se ritorna dalla sua chiamata. Se la funzione era stata lanciata, il codice immediatamente successivo alla chiamata della funzione non sarebbe stato eseguito.