Le implementazioni possono differire, ma ci sono alcune idee di base che derivano dai requisiti.
L'oggetto eccezione stesso è un oggetto creato in una funzione, distrutto in un suo chiamante. Quindi, in genere non è possibile creare l'oggetto sullo stack. D'altra parte, molti oggetti eccezione non sono molto grandi. Ergo, si può creare, ad esempio, un buffer da 32 byte e un overflow da accumulare se è effettivamente necessario un oggetto eccezione più grande.
Per quanto riguarda l'effettivo trasferimento del controllo, esistono due strategie. Uno è registrare abbastanza informazioni nello stack stesso per srotolare lo stack. Questo è fondamentalmente un elenco di distruttori da eseguire e gestori di eccezioni che potrebbero catturare l'eccezione. Quando si verifica un'eccezione, eseguire nuovamente lo stack eseguendo quei distruttori fino a trovare un catch corrispondente.
La seconda strategia sposta queste informazioni in tabelle fuori dallo stack. Ora, quando si verifica un'eccezione, lo stack di chiamate viene utilizzato per scoprire quali ambiti vengono inseriti ma non chiusi. Questi vengono quindi cercati nelle tabelle statiche per determinare dove verrà gestita l'eccezione generata e quali distruttori verranno eseguiti nel mezzo. Ciò significa che c'è meno overhead di eccezioni sullo stack; gli indirizzi di ritorno sono comunque necessari. Le tabelle sono dati extra, ma il compilatore può inserirle in un segmento caricato a richiesta del programma.