Come al solito, basterebbe leggere attentamente la documentazione ufficiale per rendersene conto. Nella pagina di set_error_handler si trova scritto che:
Also note that it is your responsibility to die() if necessary. If the error-handler function returns, script execution will continue with the next statement after the one that caused an error.
Mentre nella documentazione di set_exception_handler si legge:
Execution will stop after the exception_handler is called.
Quindi, se si genera un errore nello script, viene richiamata automaticamente la funzione specificata da set_error_handler e poi il flusso del programma continua dall'istruzione successiva a quella che ha generato l'errore. Se invece viene sollevata una eccezione e questa non viene catturata da un blocco "catch", allora viene richiamata la funzione specificata da set_exception_handler e l'esecuzione dello script termina. In altre parole ad un errore è possibile porvi rimedio e proseguire con l'esecuzione, ad una eccezione non gestita no.
Se decidiamo quindi di utilizzare le eccezioni in una applicazione PHP è importante ricordarsi di aggiungere sempre un blocco try-catch per gestirle. Diversamente da ciò che è possibile fare per gli errori, non possiamo usare set_exception_handler per rimediare ad una eccezione non gestita.