Cos'è un runtime error (errore di runtime)?
Un errore di runtime (runtime error) è un errore che si verifica mentre il programma è in esecuzione, quando un'operazione non si può eseguire con i valori che ha, come dividere per zero o leggere oltre la fine di una lista. Il programma si ferma a quella riga, a meno che l'errore non venga gestito.
Aggiornato il 24 settembre 2026
Un errore di runtime aspetta che il programma sia già in esecuzione. Il codice supera tutti i controlli prima di partire, funziona bene per un po' e poi arriva a un'operazione che non si può eseguire con i valori che ha in quel momento. Questa funzione funziona con una lista e fallisce con un'altra:
85.0
Traceback (most recent call last):
File "main.py", line 5, in <module>
print(average([]))
^^^^^^^^^^^
File "main.py", line 2, in average
return sum(scores) / len(scores)
~~~~~~~~~~~~^~~~~~~~~~~~~
ZeroDivisionError: division by zero
La prima chiamata stampa 85.0. La seconda passa una lista vuota, quindi len(scores) vale 0 e la divisione non si può fare. La grammatica era corretta, quindi non è un errore di sintassi. Il problema esiste solo con certi dati, ed è per questo che un errore di runtime può comparire dopo che un programma ha funzionato bene cento volte.
Cosa succede quando si verifica un errore di runtime
- Il programma arriva a un'operazione, qui
sum(scores) / len(scores). - Il runtime la controlla prima di eseguirla. CPython verifica il divisore prima di dividere, la JVM controlla ogni indice di un array e Python controlla che una chiave di dizionario esista prima di restituirne il valore.
- Il controllo fallisce, quindi il runtime crea un oggetto errore. In Python e Java questo oggetto è un'eccezione, e registra il tipo di errore, un messaggio e il punto in cui è avvenuto.
- Il runtime cerca del codice che gestisca quel tipo di errore, prima nella funzione corrente, poi nella funzione che l'ha chiamata, e così via verso l'esterno.
- Se niente lo gestisce, il programma si ferma. Python stampa un traceback ed esce con codice di uscita 1. Java stampa uno stack trace che inizia con
Exception in thread "main".
I linguaggi senza questi controlli si comportano in modo diverso. Il C non controlla gli indici degli array né i puntatori, quindi un accesso sbagliato alla memoria o corrompe i dati in silenzio o fa sì che il sistema operativo chiuda il programma con un segmentation fault.
Tutto quello che il programma ha fatto prima della riga che fallisce è già avvenuto. Questo ciclo stampa tre colori prima di fallire sul quarto:
red
green
blue
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(colors[i])
~~~~~~^^^
IndexError: list index out of range
Come leggere un traceback
Un traceback di Python si legge dal basso verso l'alto. L'ultima riga indica il tipo di errore e il messaggio: ZeroDivisionError: division by zero. Le righe sopra mostrano la catena di chiamate, dalla più vecchia alla più recente. Nel primo esempio, la riga 5 ha chiamato average, e la riga 2, dentro average, è quella in cui la divisione è fallita.
La riga in cui è avvenuto l'errore non è sempre quella da modificare. La riga 2 di average è corretta. La vera domanda è come ci sia arrivata una lista vuota, quindi segui il valore sbagliato fino alla sua origine e correggilo lì. Quando un traceback passa per file di librerie che non hai scritto tu, cerca l'ultima riga che punta al tuo file.
Errori di runtime comuni
Ognuno di questi messaggi è copiato da Python 3.12.
| Errore | Esempio | Messaggio |
|---|---|---|
ZeroDivisionError | 10 / 0 | division by zero |
IndexError | ["red", "green", "blue"][3] | list index out of range |
KeyError | {"theme": "dark"}["font"] | 'font' |
ValueError | int("twenty") | invalid literal for int() with base 10: 'twenty' |
TypeError | "Total: " + 5 | can only concatenate str (not "int") to str |
AttributeError | chiamare .upper() su None | 'NoneType' object has no attribute 'upper' |
FileNotFoundError | open("missing.txt") | [Errno 2] No such file or directory: 'missing.txt' |
RecursionError | una funzione che chiama sé stessa all'infinito | maximum recursion depth exceeded |
Java ha equivalenti diretti, come ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException e NullPointerException. Una divisione intera per zero che nessuno cattura stampa questo in Java:
Exception in thread "main" java.lang.ArithmeticException: / by zero
JavaScript è più tollerante con i numeri: 10 / 0 vale Infinity, non è un errore. Fallisce quando usi un valore che non c'è. Node.js stampa questo per user.name quando user è undefined:
TypeError: Cannot read properties of undefined (reading 'name')
Come correggere un errore di runtime
- Riproducilo. Esegui di nuovo il programma con lo stesso input e verifica di ottenere lo stesso errore.
- Leggi l'ultima riga del traceback, poi trova la riga corrispondente nel tuo codice.
- Guarda i valori coinvolti. Stampali subito prima della riga che fallisce, oppure fermati lì con un breakpoint del debugger.
- Correggi la causa. Sistema l'indice, gestisci il caso speciale o valida l'input prima di usarlo.
Per la funzione average, la soluzione è decidere quanto deve valere la media quando non ci sono punteggi e scriverlo nel codice:
85.0
0
Alcuni errori non dipendono da te: un file che è stato cancellato, una rete che va in timeout, un utente che scrive lettere dove serve un numero. Non puoi evitarli correggendo il codice, quindi li catturi con la gestione delle eccezioni e decidi cosa fa il programma dopo. Quello che non devi fare è avvolgere un bug in un try e nasconderlo. Un IndexError causato da un ciclo che conta un passo di troppo è un errore da correggere, non da catturare.
Messaggi di runtime error su Windows e in Excel
Il termine compare anche fuori dal tuo codice. Una finestra di Windows intitolata Microsoft Visual C++ Runtime Library con la scritta Runtime Error! significa che un programma scritto in C++ ha avuto un errore fatale e il runtime del C++ lo ha chiuso. Da utente non puoi modificare quel codice, quindi i rimedi più comuni sono aggiornare il programma, riparare o reinstallare i pacchetti Microsoft Visual C++ Redistributable e, per i giochi, aggiornare il driver della scheda video.
Le macro di Excel scritte in VBA segnalano errori di runtime numerati. Run-time error '9': Subscript out of range significa che la macro ha chiesto un foglio o un elemento di un array che non esiste, e Run-time error '1004' è un errore generico che si verifica quando fallisce un'operazione su una cartella di lavoro, un foglio o un intervallo. L'idea è la stessa di Python: codice valido che ha incontrato un valore che non riusciva a gestire.
Cosa leggere dopo
Gli errori di runtime hanno due fratelli: l'errore di sintassi, trovato prima che il programma parta, e l'errore logico, che non produce mai nessun messaggio. Per far sì che il programma si riprenda dagli errori di runtime invece di andare in crash, leggi la pagina sulla gestione delle eccezioni e poi le guide di Python sulle eccezioni e sul debug degli errori. Il corso Python ti fa scrivere e correggere codice come questo in ogni lezione.
Domande frequenti
Che differenza c'è tra un errore di runtime e un errore di sintassi?
Perché continuo a ricevere errori di runtime?
Cosa significa Runtime Error su LeetCode?
None, oppure una ricorsione così profonda da far traboccare lo stack. Esegui tu stesso l'input che fallisce, mostrato nella pagina dei risultati, e controlla i casi limite: un array vuoto, un solo elemento e la dimensione massima consentita.Un errore di runtime è la stessa cosa di un'eccezione?
RuntimeException è anche il nome di una famiglia specifica di eccezioni, quelle non controllate come NullPointerException.