Usare i traceback per trovare gli errori

Completato

Le eccezioni in Python sono una funzionalità di base del linguaggio. Ci si potrebbe sorprendere leggendo che un elemento che produce errori è evidenziato come funzionalità. Questa sorpresa può essere dovuta al fatto che strumenti software affidabili non sembrano arrestarsi in modo anomalo con un traceback (diverse righe di testo che indicano come l'errore è stato avviato e terminato).

Tuttavia, le eccezioni sono utili perché consentono di prendere decisioni generando messaggi di errore descrittivi. Possono supportare la gestione di problemi previsti e imprevisti.

Traceback

Un traceback è il corpo di testo che può puntare all'origine (e alla fine) di un errore non gestito. Il riconoscimento dei componenti di un traceback consente di rendere più efficace la correzione di errori o il debug di un programma che non funziona correttamente.

La prima volta che si verificano eccezioni in Python, si potrebbe essere tentati di evitare l'errore eliminandolo. Quando un programma subisce un errore non gestito, un traceback viene visualizzato come output. Come si vedrà in questo modulo, i traceback sono utili. Esistono modi per gestire correttamente gli errori in modo che non vengano visualizzati o che mostrino solo informazioni utili.

Aprire una sessione interattiva di Python e provare ad aprire un file inesistente:

open("/path/to/mars.jpg")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

L'output ha diverse parti chiave. In primo luogo, il traceback indica l'ordine dell'output. Informa quindi che il file è stdin (input nel terminale interattivo) nella prima riga dell'input. L'errore è FileNotFoundError (il nome dell'eccezione), il che significa che il file non esiste o forse la sua directory non esiste.

Si tratta di un numero elevato di informazioni. Può essere difficile capire perché la riga 1 è significativa o cosa significa Errno 2.

Aprire la directory desiderata in Visual Studio Code e creare un file Python denominato open.py.

Screenshot showing the creation of a new Python file in Visual Studio Code.

Aggiungere il contenuto seguente al file e salvare:

def main():
    open("/path/to/mars.jpg")

if __name__ == '__main__':
    main()

Si tratta di una singola funzione main() che apre il file inesistente, proprio come in precedenza. Al termine, questa funzione usa un helper Python che indica all'interprete di eseguire la funzione main() quando viene chiamata nel terminale. Eseguire il comando in un terminale Bash con Python e controllare il messaggio di errore:

python3 open.py
Traceback (most recent call last):
  File "/tmp/open.py", line 5, in <module>
    main()
  File "/tmp/open.py", line 2, in main
    open("/path/to/mars.jpg")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

L'output degli errori ha più senso ora. I percorsi puntano a un singolo file denominato open.py. L'output indica che l'errore inizia alla riga 5, che include la chiamata a main(). L'output segue quindi l'errore alla riga 2 nella chiamata di funzione open(). Infine, FileNotFoundError segnala di nuovo che il file o la directory non esiste.

I traceback includono quasi sempre le informazioni seguenti:

  • Tutti i percorsi di file coinvolti, per ogni chiamata a ogni funzione.
  • I numeri di riga associati a ogni percorso di file.
  • I nomi di funzioni, metodi o classi coinvolti nella generazione di un'eccezione.
  • Il nome dell'eccezione generata.