Nella mia mente, l'argomento più importante è la differenza in ciò che accade quando il programmatore commette un errore. Dimenticare di gestire un errore è un errore molto comune e facile da fare.
Se si restituiscono codici di errore, è possibile ignorare silenziosamente un errore. Ad esempio, se malloc fallisce, restituisce NULL
e imposta il errno
globale. Quindi il codice corretto dovrebbe fare
void* myptr = malloc(1024);
if (myptr == NULL) {
perror("malloc");
exit(1);
}
doSomethingWith(myptr);
Ma è molto semplice e opportuno scrivere invece:
void* myptr = malloc(1024);
doSomethingWith(myptr);
che inaspettatamente supererà NULL
nella tua altra procedura e probabilmente scarterà errno
che è stata accuratamente impostata. Non c'è nulla di visibilmente sbagliato nel codice per indicare che questo è possibile.
In una lingua che usa le eccezioni, dovresti scrivere
MyCoolObject obj = new MyCoolObject();
doSomethingWith(obj);
In questo esempio (Java), l'operatore new
restituisce un oggetto inizializzato valido o genera OutOfMemoryError
. Se un programmatore deve gestire questo, possono prenderlo. Nel solito (e convenientemente, anche il pigro) caso in cui si tratta di un errore fatale, la propagazione delle eccezioni termina il programma in modo relativamente pulito ed esplicito.
Questo è uno dei motivi per cui le eccezioni, se utilizzate correttamente, possono rendere molto più semplice la scrittura di codice chiaro e sicuro. Questo schema si applica a molte, molte cose che possono andare storte, non solo allocare memoria.