{"id":46504,"date":"2025-05-07T06:29:22","date_gmt":"2025-05-07T06:29:22","guid":{"rendered":"https:\/\/www.carmatec.com\/?p=46504"},"modified":"2025-12-31T07:39:38","modified_gmt":"2025-12-31T07:39:38","slug":"come-stampare-ed-eseguire-il-debug-delle-eccezioni-in-python-come-un-professionista","status":"publish","type":"post","link":"https:\/\/www.carmatec.com\/it_it\/blog\/how-to-print-and-debug-exceptions-in-python-like-a-pro\/","title":{"rendered":"Come stampare e fare il debug delle eccezioni in Python come un professionista"},"content":{"rendered":"<div data-elementor-type=\"wp-post\" data-elementor-id=\"46504\" class=\"elementor elementor-46504\" data-elementor-post-type=\"post\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cf469a3 e-flex e-con-boxed e-con e-parent\" data-id=\"cf469a3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6c8ef79 elementor-widget elementor-widget-text-editor\" data-id=\"6c8ef79\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Python \u00e8 famoso per la sua semplicit\u00e0 e leggibilit\u00e0, ma anche il codice pi\u00f9 elegante pu\u00f2 incontrare errori. Quando le cose vanno male, le eccezioni sono il modo in cui Python segnala che \u00e8 successo qualcosa di inaspettato. Sapere come stampare e gestire queste eccezioni \u00e8 un'abilit\u00e0 fondamentale per ogni sviluppatore, sia che si tratti di un semplice script che di un'applicazione complessa. In questa guida approfondita, esploreremo l'arte di stampare le eccezioni in Python, approfondendo tecniche pratiche, best practice ed esempi reali per aiutarvi a eseguire il debug in modo efficace e a scrivere codice robusto.<\/p><p>Questo articolo tratter\u00e0 i fondamenti delle eccezioni, i vari metodi per stamparle, le tecniche avanzate di debug e un esempio pratico di codifica. Alla fine, sarete in grado di gestire gli errori con sicurezza e precisione.<\/p><h3><strong>Cosa sono le eccezioni in Python?<\/strong><\/h3><p>Prima di addentrarci nella stampa delle eccezioni, chiariamo cos'\u00e8 un'eccezione. In Python, un'eccezione \u00e8 un evento che interrompe il normale flusso di esecuzione di un programma. \u00c8 il modo in cui Python dice: \"Ehi, qui c'\u00e8 qualcosa che non va!\". Le eccezioni possono verificarsi per vari motivi, come ad esempio:<\/p><ul><li><strong>FileNotFoundError:<\/strong> Tentativo di aprire un file inesistente.<\/li><li><strong>ZeroDivisionError:<\/strong> Dividere un numero per zero.<\/li><li><strong>TypeError:<\/strong> Esecuzione di un'operazione su tipi di dati incompatibili.<\/li><li><strong>KeyError:<\/strong> Accesso a una chiave di dizionario inesistente.<\/li><\/ul><p>Quando si verifica un'eccezione, Python la solleva e, se non viene gestita, il programma si blocca con un traceback, ovvero un rapporto dettagliato dell'errore. La stampa delle eccezioni consente di catturare e analizzare questi errori, facilitando il debugging.<\/p><h3><strong>Perch\u00e9 stampare le eccezioni?<\/strong><\/h3><p>La stampa delle eccezioni ha diversi scopi:<\/p><ul><li><strong>Debug:<\/strong> Aiuta a identificare la causa e la posizione di un errore.<\/li><li><strong>Registrazione:<\/strong> Registra gli errori per una successiva analisi, fondamentale per le applicazioni di produzione.<\/li><li><strong>Feedback degli utenti:<\/strong> Fornisce agli utenti messaggi di errore significativi.<\/li><li><strong>Miglioramento del codice:<\/strong> La comprensione delle eccezioni aiuta a scrivere codice pi\u00f9 robusto.<\/li><\/ul><p>Esaminiamo ora i vari modi per stampare le eccezioni in Python.<\/p><h5><strong>Metodo 1: Utilizzo di un blocco Try-Except di base<\/strong><\/h5><p>Il modo pi\u00f9 semplice per stampare un'eccezione \u00e8 l'utilizzo di un'opzione <code>prova-eccezione<\/code> blocco. Questa struttura consente di catturare le eccezioni e di stamparne i dettagli.<\/p><pre>pitone\nprova:\n    risultato = 10 \/ 0\ntranne ZeroDivisionError come e:\n    print(f \"Si \u00e8 verificato un errore: {e}\")<\/pre><p><strong>Uscita:<br \/><\/strong>Si \u00e8 verificato un errore: divisione per zero<\/p><p>In questo esempio:<\/p><ul><li>IL <code>provare<\/code> contiene codice che potrebbe sollevare un'eccezione.<\/li><li>IL <code>tranne<\/code> cattura il blocco <code>ZeroDivisionError<\/code> e la memorizza nella variabile <code>e<\/code>.<\/li><li>IL <code>stampa<\/code> visualizza il messaggio di eccezione.<\/li><\/ul><p>L'as <code>e<\/code> assegna l'oggetto eccezione a <code>e<\/code>che contiene il messaggio di errore. \u00c8 possibile sostituire <code>ZeroDivisionError<\/code> con altri tipi di eccezione o utilizzare un generico <code>Eccezione<\/code> per catturare tutte le eccezioni (anche se questo non \u00e8 sempre consigliato).<\/p><h5><strong>Metodo 2: stampare il traceback completo<\/strong><\/h5><p>A volte \u00e8 necessario qualcosa di pi\u00f9 del semplice messaggio di errore: \u00e8 necessario il traceback completo per vedere dove si \u00e8 verificato l'errore. La funzione <code>traceback<\/code> Il modulo \u00e8 perfetto per questo scopo.<\/p><pre>python\nimportare traceback\n\nprova:\n    risultato = 10 \/ 0\ntranne ZeroDivisionError:\n    traceback.print_exc()<\/pre><p><strong>Uscita:<\/strong><br \/>Traceback (ultima chiamata):<br \/>File \"script.py\", riga 4, in<br \/>risultato = 10 \/ 0<br \/>ZeroDivisionError: divisione per zero<\/p><p>IL <code>traceback.print_exc()<\/code> stampa la traccia completa dello stack, mostrando il file, il numero di riga e lo stack di chiamate che hanno portato all'errore. Questa funzione \u00e8 preziosa per il debug di applicazioni complesse.<\/p><h3><strong>Metodo 3: catturare il tipo di eccezione e i relativi dettagli<\/strong><\/h3><p>Per ottenere un maggiore controllo, \u00e8 possibile catturare il tipo di eccezione, il messaggio e il traceback usando <code>sys.exc_info()<\/code> dal <code>sistema<\/code> modulo.<\/p><pre>python\nimportare sys\n\nprova:\n    risultato = 10 \/ 0\nexcept:\n    exc_type, exc_value, exc_traceback = sys.exc_info()\n    print(f \"Tipo di eccezione: {exc_type}\")\n    print(f \"Messaggio di eccezione: {exc_value}\")\n    print(f \"Traceback: {exc_traceback}\")<\/pre><p>Uscita:<br \/>Tipo di eccezione:<br \/>Messaggio di eccezione: divisione per zero<br \/>Traceback:<\/p><p>Questo metodo fornisce informazioni dettagliate sull'eccezione, utili per la registrazione o la gestione personalizzata degli errori. Si noti che <code>sys.exc_info()<\/code> restituisce una tupla contenente il tipo di eccezione, il valore e l'oggetto traceback.<\/p><h5><strong>Metodo 4: Utilizzo di <code>prova-eccezione<\/code> con <code>altro<\/code> E <code>finalmente<\/code><\/strong><\/h5><p>Python <code>prova-eccezione<\/code> supporta clausole aggiuntive: <code>altro<\/code> E <code>finalmente<\/code>. Questi possono migliorare la gestione delle eccezioni.<\/p><pre>pitone\ntry:\n    numero = int(input(\"Inserisci un numero: \"))\ntranne ValueError as e:\n    print(f \"Input non valido: {e}\")\nelse:\n    print(f \"Hai inserito: {numero}\")\ninfine:\n    print(\"Esecuzione completata.\")<\/pre><p><strong>Esempio di uscita (ingresso non valido):<\/strong><br \/>Immettere un numero: abc<br \/>Input non valido: letterale non valido per int() con base 10: 'abc'.<br \/>Esecuzione completata.<\/p><p><strong>Esempio di uscita (ingresso valido):<\/strong><br \/>Immettere un numero: 42<br \/>Sei entrato: 42<br \/>Esecuzione completata.<\/p><ul><li>IL <code>altro<\/code> viene eseguito se non si verifica alcuna eccezione, consentendo di separare la logica di successo dalla gestione degli errori.<\/li><li>IL <code>finalmente<\/code> viene eseguito indipendentemente dal verificarsi di un'eccezione, ideale per operazioni di pulizia come la chiusura di file o il rilascio di risorse.<\/li><\/ul><h5><strong>Metodo 5: registrazione delle eccezioni per la produzione<\/strong><\/h5><p>Nelle applicazioni di produzione, stampare le eccezioni sulla console non \u00e8 sufficiente: \u00e8 necessario registrarle per un'analisi successiva. Il sistema Python <code>registrazione<\/code> Il modulo \u00e8 perfetto per questo scopo.<\/p><pre>python\nimportare il logging\n\nlogging.basicConfig(filename='app.log', level=logging.ERROR)\n\nprova:\n    risultato = 10 \/ 0\ntranne ZeroDivisionError come e:\n    logging.error(\"Si \u00e8 verificato un errore\", exc_info=True)<\/pre><p>Questo codice registra l'eccezione, compreso il traceback completo, in un file chiamato <code>app.log<\/code>. Il <code>exc_info=True<\/code> assicura che il traceback sia incluso. Si pu\u00f2 anche configurare la registrazione per inviare gli errori a un server o per inviarli via e-mail agli sviluppatori.<\/p><h3><strong>Migliori pratiche per la stampa di eccezioni<\/strong><\/h3><p>Per stampare le eccezioni in modo efficace, seguite queste best practice:<\/p><ul><li><strong>Siate specifici con le eccezioni:<\/strong> Catturare eccezioni specifiche (ad es, <code>ZeroDivisionError<\/code>) invece di un generico <code>Eccezione<\/code> per evitare di mascherare errori imprevisti.<\/li><li><strong>Includere il contesto:<\/strong> Fornire messaggi significativi per aiutare a diagnosticare il problema (ad esempio, \"Non \u00e8 riuscito a dividere 10 per 0\").<\/li><li><strong>Utilizzare la registrazione in produzione:<\/strong> Evitare <code>stampa<\/code> nel codice di produzione; utilizzare l'opzione <code>registrazione<\/code> al posto del modulo.<\/li><li><strong>Evitare le eccezioni nude:<\/strong> Utilizzo <code>eccetto:<\/code> senza specificare un tipo di eccezione pu\u00f2 catturare segnali di sistema come <code>Interruzione della tastiera<\/code>che porta a problemi difficili da debuggare.<\/li><li><strong>Risorse per la pulizia:<\/strong> Utilizzo <code>finalmente<\/code> o i gestori di contesto (<code>con<\/code> per garantire che le risorse come i file o le connessioni al database siano chiuse correttamente.<\/li><\/ul><h3><strong>Esempio di codifica nel mondo reale: Uno script di elaborazione file<\/strong><\/h3><p>Let\u2019s put everything together with a practical example\u2014exactly the kind of exercise you\u2019d complete in a <a href=\"https:\/\/www.mygreatlearning.com\/academy\/premium\/master-python-programming\">python programming course<\/a>. Below is a script that processes a file, handles exceptions, and logs errors. This example demonstrates multiple exception-handling techniques.<\/p><pre>python\nimportare il logging\nimportare traceback\nimportare sys\n\n# Configurare la registrazione\nlogging.basicConfig(\n    filename='file_processor.log',\n    level=logging.ERROR,\n    format='%(asctime)s - %(levelname)s - %(message)s'\n)\n\ndef process_file(filename):\n    \"\"\"\n    Elabora un file e calcola la somma dei numeri in esso contenuti.\n    Ogni riga deve contenere un numero.\n    \"\"\"\n    totale = 0\n    numero_riga = 0\n\n    Prova:\n        con open(filename, 'r') come file:\n            per riga in file:\n                numero_linea += 1\n                prova:\n                    numero = float(line.strip())\n                    totale += numero\n                tranne ValueError as e:\n                    print(f \"Numero non valido alla riga {numero_riga}: {linea.strip()}\")\n                    logging.error(f \"ValueError alla riga {linea_numero}: {e}\")\n                    continuare\n        altrimenti:\n            print(f \"File elaborato con successo. Totale: {totale}\")\n    except FileNotFoundError as e:\n        print(f \"Errore: File '{filename}' non trovato.\")\n        logging.error(f \"FileNotFoundError: {e}\", exc_info=True)\n    except PermissionError as e:\n        print(f \"Errore: permesso negato per il file '{filename}'.\")\n        logging.error(f \"PermissionError: {e}\", exc_info=True)\n    except Exception as e:\n        print(f \"Si \u00e8 verificato un errore inatteso: {e}\")\n        exc_type, exc_value, exc_traceback = sys.exc_info()\n        logging.error(\n            f \"Errore inatteso: {exc_type} - {exc_value}\",\n            exc_info=True\n        )\n    infine:\n        print(\"Tentativo di elaborazione del file completato.\")\n\n# Testare la funzione\nif __name__ == \"__main__\":\n    test_file = \"numeri.txt\"\n    print(f \"Tentativo di elaborazione del file: {test_file}\")\n    process_file(test_file)<\/pre><h3><strong>Come funziona:<\/strong><\/h3><ul><li><strong>Impostazione della registrazione:<\/strong> Lo script configura l'opzione <code>registrazione<\/code> per scrivere gli errori in <code>file_processor.log<\/code> con i timestamp.<\/li><li><strong>Prova-eccezione annidata:<\/strong> L'esterno <code>provare<\/code> gestisce gli errori relativi ai file (<code>FileNotFoundError, PermissionError<\/code>), mentre la parte interna <code>provare<\/code> gestisce i numeri non validi (<code>ValoreErrore<\/code>).<\/li><li><strong>Gestore del contesto:<\/strong> IL <code>con<\/code> assicura che il file venga chiuso correttamente, anche se si verifica un errore.<\/li><li><strong>Clausola Else:<\/strong> Se il file viene elaborato senza errori, viene stampato il totale.<\/li><li><strong>Clausola finale:<\/strong> Viene stampato un messaggio per indicare il completamento del processo.<\/li><li><strong>Registrazione completa:<\/strong> Tutte le eccezioni vengono registrate con traceback per il debug.<\/li><\/ul><p><strong>File di input di esempio (<code>numeri.txt<\/code>):<\/strong><br \/>10<br \/>20<br \/>abc<br \/>30<\/p><p><strong>Esempio di uscita:<\/strong><br \/>Tentativo di elaborazione del file: numbers.txt<br \/>Numero non valido alla riga 3: abc<br \/>File elaborato con successo. Totale: 60.0<br \/>Tentativo di elaborazione del file completato.<\/p><p><strong>File di registro di esempio (<code>file_processor.log<\/code>):<\/strong><br \/>2026-05-07 10:00:00,123 &#8211; ERROR &#8211; ValueError at line 3: could not convert string to float: &#8216;abc&#8217;<br \/>Se il file non esiste, l'output potrebbe essere:<br \/>Tentativo di elaborazione del file: numbers.txt<br \/>Errore: File 'numbers.txt' non trovato.<br \/>Tentativo di elaborazione del file completato.<\/p><h3><strong>Suggerimenti per il debug avanzato<\/strong><\/h3><p>Per portare la gestione delle eccezioni a un livello superiore:<\/p><ul><li><strong>Utilizzare i debugger:<\/strong> Strumenti come <code>pdb<\/code> o gli IDE (ad esempio, PyCharm, VS Code) consentono di analizzare il codice e di ispezionare le variabili quando si verifica un'eccezione.<\/li><li><strong>Eccezioni personalizzate:<\/strong> Definire le proprie classi di eccezione per condizioni di errore specifiche in progetti di grandi dimensioni.<\/li><li><strong>Sentry o strumenti simili:<\/strong> Utilizzate i servizi di tracciamento degli errori per monitorare le eccezioni nelle applicazioni di produzione.<\/li><li><strong>Test unitari:<\/strong> Scrivere test per simulare le eccezioni e verificare la logica di gestione degli errori.<\/li><\/ul><h2><strong>Conclusione<\/strong><\/h2><p>La stampa delle eccezioni in Python \u00e8 molto pi\u00f9 di un semplice trucco per il debug: \u00e8 una pietra miliare per scrivere codice robusto e manutenibile. Padroneggiando <code>prova-eccezione<\/code> sfruttando i blocchi di <code>traceback<\/code> E <code>registrazione<\/code> e seguendo le migliori pratiche, \u00e8 possibile gestire gli errori con grazia e ottenere approfondimenti sul comportamento del programma. L'esempio reale fornito dimostra come combinare queste tecniche in un'applicazione pratica, rendendo il codice resiliente e pronto per la produzione.<\/p><p>Sia che siate principianti che sviluppatori esperti che costruiscono sistemi complessi, capire come stampare e gestire le eccezioni vi render\u00e0 un programmatore Python migliore. <a href=\"https:\/\/www.carmatec.com\/it_it\/\">Carmatec<\/a> consente alle aziende di disporre di un sistema robusto e scalabile. <a href=\"https:\/\/www.carmatec.com\/it_it\/societa-di-sviluppo-python\/\">Servizi di sviluppo Python<\/a> su misura per accelerare <a href=\"https:\/\/www.carmatec.com\/it_it\/servizi-di-trasformazione-digitale\/\">trasformazione digitale.<\/a><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Python is renowned for its simplicity and readability, but even the most elegant code can encounter errors. When things go awry, exceptions are Python\u2019s way of signaling that something unexpected has happened. Knowing how to print and handle these exceptions is a critical skill for any developer, whether you\u2019re building a simple script or a [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":46521,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,76],"tags":[],"class_list":["post-46504","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-python"],"_links":{"self":[{"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/posts\/46504","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/comments?post=46504"}],"version-history":[{"count":0,"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/posts\/46504\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/media\/46521"}],"wp:attachment":[{"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/media?parent=46504"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/categories?post=46504"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.carmatec.com\/it_it\/wp-json\/wp\/v2\/tags?post=46504"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}