Come detto da @saidai, un errore non gestito fa crashare il programma completamente, mentre un errore "bloccato" dal try/catch permette al programmatore di definire il comportamento del programma nel caso in cui si vada a verificare un errore non previsto.
Immagina di aver realizzato un programma che va a lavorare con un file di grandi dimensioni. Mentre il programma sta leggendo/scrivendo sul file si verifica un errore imprevisto. A quel punto le opzioni sono due: il file non si corrompe per colpo di fortuna oppure si corrompe perdendo tutti i dati. Utilizzando un try/catch, invece, un approccio possibile potrebbe essere quello di "bloccare" l'errore temporaneamente per poi assicurarsi che il file sia chiuso e solo dopo generare manualmente l'errore tramite un raise. In questo modo il programma viene comunque terminato, però siamo sicuri che non siano accadute cose sgradevoli.