{"id":51581,"date":"2022-02-08T14:06:01","date_gmt":"2022-02-08T13:06:01","guid":{"rendered":"https:\/\/kinsta.com\/it\/?p=51581&#038;preview=true&#038;preview_id=51581"},"modified":"2023-06-09T16:42:25","modified_gmt":"2023-06-09T15:42:25","slug":"errori-in-javascript","status":"publish","type":"post","link":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/","title":{"rendered":"Guida Definitiva alla Gestione degli Errori in JavaScript"},"content":{"rendered":"<p>La legge di Murphy afferma che tutto ci\u00f2 che pu\u00f2 andare male alla fine andr\u00e0 male. Questo si applica molto bene al mondo della programmazione. Se create un&#8217;applicazione, \u00e8 probabile che si generino bug e altri problemi. Gli errori in JavaScript sono uno di questi problemi!<\/p>\n<p>Il successo di un prodotto software dipende da come le persone che lo hanno progettato riescono a risolvere questi problemi prima che generino un danno per i loro utenti. E <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-javascript\/\">JavaScript<\/a>, tra tutti i <a href=\"https:\/\/kinsta.com\/it\/blog\/miglior-linguaggio-di-programmazione\/\">linguaggi di programmazione<\/a>, \u00e8 noto per la sua scarsa gestione degli errori.<\/p>\n<p>Se state <a href=\"https:\/\/kinsta.com\/it\/blog\/librerie-javascript\/\">costruendo un&#8217;applicazione JavaScript<\/a>, c&#8217;\u00e8 un&#8217;alta probabilit\u00e0 che, a un certo punto, riscontriate problemi con i tipi di dati. Se non \u00e8 cos\u00ec, allora potreste finire per sostituire un <i>undefined<\/i>con un <i>null<\/i> o un operatore triplo uguale (<code>===<\/code>) con un operatore doppio uguale (<code>==<\/code>).<\/p>\n<p>Commettere errori \u00e8 umano. Ecco perch\u00e9 in questo articolo vi mostreremo tutto quello che c\u2019\u00e8 da sapere sulla gestione degli errori in JavaScript.<\/p>\n<p>L&#8217;articolo vi guider\u00e0 alla scoperta degli errori di base in JavaScript e vi spiegher\u00e0 i vari errori che potreste incontrare. Imparerete poi a identificare e correggere questi errori. Ci sono anche un paio di consigli per gestire efficacemente gli errori in ambienti di produzione.<\/p>\n<p>Ma non indugiamo oltre, cominciamo!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h3>Guarda la Nostra Video-Guida alla <a href=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\">Gestione degli Errori JavaScript<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\"><\/kinsta-video>\n<h2>Cosa Sono gli Errori JavaScript?<\/h2>\n<p>Gli errori nella programmazione si riferiscono a sivostrazioni che non permettono a un programma di funzionare normalmente. Pu\u00f2 accadere quando un programma non sa come gestire il lavoro in corso, come quando si cerca di aprire un file inesistente o di raggiungere un endpoint API basato sul web mentre non c&#8217;\u00e8 connettivit\u00e0 di rete.<\/p>\n<p>Queste sivostrazioni spingono il programma a lanciare errori all&#8217;utente, affermando che non sa come procedere. Il programma raccoglie quante pi\u00f9 informazioni possibili sull&#8217;errore e poi segnala che non pu\u00f2 andare avanti.<\/p>\n\n<p>Chi lavora nella programmazione e ha una certa lungimiranza, cerca di prevedere e coprire questi scenari in modo che l&#8217;utente non debba interpretare autonomamente un <a href=\"https:\/\/kinsta.com\/it\/blog\/codici-di-stato-http\/\">messaggio di errore tecnico come &#8220;404&#8221;<\/a>. Basta cambiare il messaggio usando parole pi\u00f9 comprensibili come &#8220;La pagina non \u00e8 stata trovata&#8221;.<\/p>\n<p>Gli errori in JavaScript sono oggetti che compaiono ogni volta che si verifica un errore di programmazione. Questi oggetti contengono ampie informazioni sul tipo di errore, l&#8217;istruzione che ha causato l&#8217;errore e lo stack trace di quando si \u00e8 verificato l&#8217;errore. JavaScript permette inoltre a chi programma di creare errori personalizzati per fornire informazioni extra durante il debug dei problemi.<\/p>\n<h3>Propriet\u00e0 di un Errore<\/h3>\n<p>Ora che la definizione di un errore JavaScript \u00e8 chiara, \u00e8 il momento di entrare nei dettagli.<\/p>\n<p>Gli errori in JavaScript contengono alcune propriet\u00e0 standard e personalizzate che aiutano a capire la causa e gli effetti dell&#8217;errore. Per impostazione predefinita, gli errori in JavaScript contengono tre propriet\u00e0:<\/p>\n<ol>\n<li><b>message<\/b>: il valore stringa che riporta il messaggio di errore;<\/li>\n<li><b>name<\/b>: il tipo di errore che si \u00e8 verificato (lo approfondiremo nella prossima sezione);<\/li>\n<li><b>stack<\/b>: lo stack trace del codice eseguito quando si \u00e8 verificato l&#8217;errore.<\/li>\n<\/ol>\n<p>Inoltre, gli errori possono anche portare propriet\u00e0 come <i>columnNumber, lineNumber, fileName, <\/i>ecc. per descrivere meglio l&#8217;errore. Tuttavia, queste propriet\u00e0 non sono standard e possono essere presenti o meno in ogni oggetto di errore generato dalla vostra applicazione JavaScript.<\/p>\n<h3>Capire lo Stack Trace<\/h3>\n<p>Lo stack trace (che potremmo tradurre letteralmente come \u201ctraccia dello stack\u201d) \u00e8 l&#8217;elenco delle chiamate di metodo in cui si trovava un programma quando si \u00e8 verificato un evento come un&#8217;eccezione o un avvertimento. Ecco come appare uno stack trace accompagnato da un&#8217;eccezione:<\/p>\n<figure id=\"attachment_110237\" aria-describedby=\"caption-attachment-110237\" style=\"width: 1138px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110237 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-output-numeric.png\" alt=\"L\u2019errore \u201cTypeError: Numeric argument is expected\u201d \u00e8 mostrato su uno sfondo grigio con ulteriori dettagli sullo stack\" width=\"1138\" height=\"278\"><figcaption id=\"caption-attachment-110237\" class=\"wp-caption-text\">Esempio di Stack Trace.<\/figcaption><\/figure>\n<p>Come potete vedere, inizia pubblicando il nome e il messaggio dell&#8217;errore, seguito da una lista di metodi che sono stati chiamati. Ogni chiamata di metodo indica la posizione del suo codice sorgente e la linea in cui \u00e8 stato richiamato. Potete usare questi dati per navigare nel vostro codebase e identificare il pezzo di codice che sta causando l&#8217;errore.<\/p>\n<p>Questo elenco di metodi \u00e8 organizzato in modo impilato (stacked). Mostra in che punto la vostra eccezione \u00e8 stata lanciata per la prima volta e come si \u00e8 propagata attraverso le chiamate impilate. L&#8217;implementazione di un catch per l&#8217;eccezione non permetter\u00e0 che si propaghi attraverso lo stack e mandi in crash il vostro programma. Tuttavia, in alcune situazioni potreste intenzionalmente voler lasciare irrisolti gli errori fatali per mandare in crash il programma.<\/p>\n<h3>Errori vs Eccezioni<\/h3>\n<p>La maggior parte delle persone di solito considera gli errori e le eccezioni come la stessa cosa. Tuttavia, \u00e8 essenziale ricordare la leggera ma fondamentale differenza tra loro.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style- info\">\n        <p>Un&#8217;eccezione \u00e8 un oggetto di errore che \u00e8 stato lanciato.<\/p>\n<\/aside>\n\n<p>Per capirlo meglio, facciamo un rapido esempio. Ecco come potete definire un errore in JavaScript:<\/p>\n<pre><code class=\"language-js\">const wrongTypeError = TypeError(\"Wrong type found, expected character\")<\/code><\/pre>\n<p>E questo \u00e8 come l&#8217;oggetto <code><i>wrongTypeError<\/i><\/code> diventa un&#8217;eccezione:<\/p>\n<pre><code class=\"language-js\">throw wrongTypeError<\/code><\/pre>\n<p>Tuttavia, la maggior parte delle persone tende a usare la forma abbreviata che definisce gli oggetti di errore mentre li lancia:<\/p>\n<pre><code class=\"language-js\">throw TypeError(\"Wrong type found, expected character\")<\/code><\/pre>\n<p>Questa \u00e8 una pratica standard. Tuttavia, \u00e8 una delle ragioni per cui gli sviluppatori tendono a confondere eccezioni ed errori. Pertanto, conoscere i fondamenti \u00e8 vitale anche se usate le abbreviazioni per velocizzare il lavoro.<\/p>\n<h2>Tipi di Errori in JavaScript<\/h2>\n<p>Esiste una serie di tipi di errore predefiniti in JavaScript. Sono scelti e definiti automaticamente dal runtime JavaScript ogni volta che il programmatore o la programmatrice non gestisce esplicitamente gli errori nell&#8217;applicazione.<\/p>\n<p>Questa sezione vi guider\u00e0 attraverso alcuni dei pi\u00f9 comuni tipi di errore in JavaScript per capire quando e perch\u00e9 si verificano.<\/p>\n<h3>RangeError<\/h3>\n<p>Un RangeError viene lanciato quando una variabile viene impostata con un valore al di fuori del suo intervallo di valori legali. Di solito si verifica quando si passa un valore come argomento a una funzione e il valore dato non si trova nell&#8217;intervallo dei parametri della funzione. A volte pu\u00f2 essere difficile da risolvere quando si usano librerie di terze parti scarsamente documentate perch\u00e9 \u00e8 necessario conoscere la gamma di valori possibili per gli argomenti per passare il valore corretto.<\/p>\n<p>Alcuni degli scenari comuni in cui si verifica RangeError sono:<\/p>\n<ul>\n<li>Cercare di creare un array di lunghezza non ammessa tramite il costruttore Array.<\/li>\n<li>Passare valori errati a metodi numerici come <code>toExponential()<\/code>, <code>toPrecision()<\/code>, <code>toFixed()<\/code>, ecc.<\/li>\n<li>Passare valori non ammessi a funzioni di stringa come <code>normalize()<\/code>.<\/li>\n<\/ul>\n<h3>ReferenceError<\/h3>\n<p>Un ReferenceError si verifica quando qualcosa va storto con il riferimento di una variabile nel vostro codice. Potreste aver dimenticato di definire un valore per la variabile prima di utilizzarla, o potreste cercare di usare una variabile inaccessibile nel vostro codice. In ogni caso, l&#8217;analisi dello stack trace fornisce ampie informazioni per trovare e correggere il riferimento alla variabile che d\u00e0 errore.<\/p>\n<p>Alcune delle ragioni comuni per cui si verificano i ReferenceErrors sono:<\/p>\n<ul>\n<li>Fare un errore di battitura in un nome di variabile.<\/li>\n<li>Cercare di accedere a variabili block-scoped al di fuori dei loro scopi.<\/li>\n<li>Fare riferimento a una variabile globale da una libreria esterna (come <a href=\"https:\/\/kinsta.com\/it\/blog\/jquery-is-not-defined\/\">$ da jQuery<\/a>) prima che sia caricata.<\/li>\n<\/ul>\n<h3>SyntaxError<\/h3>\n<p>Questo tipo di errori \u00e8 tra i pi\u00f9 semplici da risolvere perch\u00e9 indicano un errore nella sintassi del codice. Poich\u00e9 JavaScript \u00e8 un <a href=\"https:\/\/kinsta.com\/it\/blog\/linguaggi-di-scripting\/\">linguaggio di scripting<\/a> interpretato piuttosto che compilato, questi errori compaiono quando l&#8217;applicazione esegue lo script che contiene l&#8217;errore. Nel caso dei linguaggi compilati, tali errori vengono identificati durante la compilazione. Pertanto, i binari dell&#8217;app non vengono creati fino a quando questi non vengono corretti.<\/p>\n<p>Alcune delle ragioni comuni per cui i SyntaxErrors potrebbero verificarsi sono:<\/p>\n<ul>\n<li>Virgolette mancanti.<\/li>\n<li>Parentesi di chiusura mancanti.<\/li>\n<li>Allineamento improprio delle parentesi graffe o di altri caratteri.<\/li>\n<\/ul>\n<p>\u00c8 una buona pratica usare uno strumento di linting nel vostro IDE per identificare tali errori prima che arrivino al browser.<\/p>\n<h3>TypeError<\/h3>\n<p>TypeError \u00e8 uno degli errori pi\u00f9 comuni nelle applicazioni JavaScript. Questo errore viene creato quando qualche valore non risulta essere di un particolare tipo previsto. Alcuni dei casi comuni in cui si verifica sono:<\/p>\n<ul>\n<li>Invocazione di oggetti che non sono metodi.<\/li>\n<li>Tentare di accedere a propriet\u00e0 di oggetti nulli o indefiniti<\/li>\n<li>Trattare una stringa come un numero o viceversa<\/li>\n<\/ul>\n<p>Ci sono molte altre possibilit\u00e0 in cui un TypeError pu\u00f2 verificarsi. Vedremo pi\u00f9 tardi alcuni casi famosi e impareremo come risolverli.<\/p>\n<h3>InternalError<\/h3>\n<p>Il tipo InternalError viene utilizzato quando si verifica un&#8217;eccezione nel motore di runtime JavaScript. Pu\u00f2 indicare o meno un problema con il vostro codice.<\/p>\n<p>Pi\u00f9 spesso, InternalError si verifica solo in due scenari:<\/p>\n<ul>\n<li>Quando una patch o un aggiornamento del runtime JavaScript porta un bug che lancia eccezioni (questo accade molto raramente).<\/li>\n<li>Quando il vostro codice contiene entit\u00e0 che sono troppo grandi per il motore JavaScript (per esempio troppi casi di switch, inizializzatori di array troppo grandi, troppa ricorsivit\u00e0).<\/li>\n<\/ul>\n<p>L&#8217;approccio pi\u00f9 appropriato per risolvere questo errore \u00e8 quello di identificare la causa attraverso il messaggio di errore e ristrutturare la logica della vostra app, se possibile, per eliminare l&#8217;improvviso picco di carico di lavoro sul motore JavaScript.<\/p>\n<h3>URIError<\/h3>\n<p>URIError si verifica quando si usa una funzione globale di gestione degli URI come <code>decodeURIComponent<\/code> ma questa non \u00e8 ammessa. Di solito indica che il parametro passato alla chiamata di metodo non \u00e8 conforme agli standard URI e quindi non \u00e8 stato <a href=\"https:\/\/kinsta.com\/it\/blog\/differire-parsing-javascript\/\">analizzato correttamente dal metodo<\/a>.<\/p>\n<p>La diagnosi di questi errori di solito \u00e8 facile dato che avete solo bisogno di esaminare gli argomenti per cercare la malformazione.<\/p>\n<h3>EvalError<\/h3>\n<p>Un EvalError si verifica in caso di errore con una chiamata alla funzione <code>eval()<\/code>. La funzione <code>eval()<\/code> \u00e8 utilizzata per eseguire il codice JavaScript memorizzato nelle stringhe. Tuttavia, poich\u00e9 l&#8217;utilizzo della funzione <code>eval()<\/code> \u00e8 altamente sconsigliato a causa di problemi di sicurezza e le attuali specifiche ECMAScript non lanciano pi\u00f9 la classe <code>EvalError<\/code>, questo tipo di errore \u00e8 rimasto semplicemente per mantenere la compatibilit\u00e0 all&#8217;indietro con il legacy code JavaScript.<\/p>\n<p>Se state lavorando su una vecchia versione di JavaScript, potreste incontrare questo errore. In ogni caso, \u00e8 meglio indagare il codice eseguito nella chiamata di funzione <code>eval()<\/code> per qualsiasi eccezione.<\/p>\n<h2>Creare Tipi di Errore Personalizzati<\/h2>\n<p>Anche se JavaScript offre una lista adeguata di classi di tipi di errore per coprire la maggior parte degli scenari, potete sempre creare un nuovo tipo di errore se la lista non soddisfa le vostre esigenze. La base di questa flessibilit\u00e0 sta nel fatto che JavaScript vi permette di lanciare letteralmente qualsiasi cosa con il comando <code>throw<\/code>.<\/p>\n<p>Quindi, tecnicamente, queste dichiarazioni sono del tutto regolari:<\/p>\n<pre><code class=\"language-js\">throw 8\nthrow \"An error occurred\"<\/code><\/pre>\n<p>Tuttavia, lanciare un tipo di dati primitivo non fornisce dettagli sull&#8217;errore, come il tipo, il nome o lo stack trace che lo accompagna. Per risolvere questo problema e standardizzare il processo di gestione degli errori, \u00e8 stata fornita la classe <code>Error<\/code>. \u00c8 anche sconsigliato usare tipi di dati primitivi mentre si lanciano le eccezioni.<\/p>\n<p>Potete estendere la classe <code>Error<\/code> per creare la vostra classe di errore personalizzata. Ecco un esempio di base di come potete farlo:<\/p>\n<pre><code class=\"language-js\">class ValidationError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"ValidationError\";\n    }\n}<\/code><\/pre>\n<p>E potete usarla nel seguente modo:<\/p>\n<pre><code class=\"language-js\">throw ValidationError(\"Property not found: name\")<\/code><\/pre>\n<p>Potete identificarlo usando la parola chiave <code>instanceof<\/code>:<\/p>\n<pre><code class=\"language-js\">try {\n    validateForm() \/\/ code that throws a ValidationError\n} catch (e) {\n    if (e instanceof ValidationError)\n    \/\/ do something\n    else\n    \/\/ do something else\n}<\/code><\/pre>\n<h2>I 10 Errori Pi\u00f9 Comuni in JavaScript<\/h2>\n<p>Ora che avete capito i tipi di errori comuni e come creare quelli personalizzati, \u00e8 il momento di guardare alcuni degli errori pi\u00f9 comuni che incontrerete quando scrivete codice JavaScript.<\/p>\n<h3>Date un&#8217;Occhiata alla Nostra Video-Guida agli <a href=\"https:\/\/www.youtube.com\/watch?v=IXrqv7Szv_g\">Errori JavaScript Pi\u00f9 Comuni<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=IXrqv7Szv_g\"><\/kinsta-video>\n<h3>1. Uncaught RangeError<\/h3>\n<p>Questo errore si verifica in Google Chrome in scenari diversi. In primo luogo, pu\u00f2 accadere se chiamate una funzione ricorsiva e questa non termina. Potete verificarlo voi stessi nella Chrome DevTools:<\/p>\n<figure id=\"attachment_110241\" aria-describedby=\"caption-attachment-110241\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110241 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/recur-range-error.png\" alt=\"L\u2019errore \u201cUncaught RangeError: Maximum call stack size exceeded\u201d \u00e8 mostrato su uno sfondo rosso accanto all'icona di una croce rossa con sopra il codice di una funzione ricorsiva\" width=\"1392\" height=\"492\"><figcaption id=\"caption-attachment-110241\" class=\"wp-caption-text\">Esempio di RangeError con una chiamata di funzione ricorsiva.<\/figcaption><\/figure>\n<p>Quindi per risolvere questo errore, assicuratevi di definire correttamente i casi limite della vostra funzione ricorsiva. Un&#8217;altra ragione per cui questo errore si verifica \u00e8 se avete passato un valore che \u00e8 fuori dall&#8217;intervallo del parametro di una funzione. Ecco un esempio:<\/p>\n<figure id=\"attachment_110239\" aria-describedby=\"caption-attachment-110239\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110239 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-range-error.png\" alt=\"L\u2019errore \u201cUncaught RangeError: toExponential() argument must be between 0 and 100\u201d \u00e8 mostrato su uno sfondo rosso accanto all'icona di una croce rossa con una chiamata alla funzione toExponential() sopra di esso.\" width=\"1392\" height=\"150\"><figcaption id=\"caption-attachment-110239\" class=\"wp-caption-text\">Esempio di RangeError con la chiamata toExponential().<\/figcaption><\/figure>\n<p>Il messaggio di errore di solito indica cosa c&#8217;\u00e8 di sbagliato nel vostro codice. Una volta apportate le modifiche, verr\u00e0 risolto.<\/p>\n<figure id=\"attachment_110240\" aria-describedby=\"caption-attachment-110240\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110240 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-error-fixed.png\" alt=\"num = 4. num.toExponential(2). Output: 4.00e+0.\" width=\"1396\" height=\"100\"><figcaption id=\"caption-attachment-110240\" class=\"wp-caption-text\">Output per la chiamata alla funzione toExponential().<\/figcaption><\/figure>\n<h3>2. Uncaught TypeError: Cannot Set Property<\/h3>\n<p>Questo errore si verifica quando impostate una propriet\u00e0 su un riferimento non definito. Potete riprodurre il problema con questo codice:<\/p>\n<pre><code class=\"language-js\">var list\nlist.count = 0<\/code><\/pre>\n<p>Ecco l&#8217;output che riceverete:<\/p>\n<figure id=\"attachment_110245\" aria-describedby=\"caption-attachment-110245\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110245 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-type-error.png\" alt=\"L\u2019errore \u201cUncaught TypeError: Cannot set properties of undefined\u201d \u00e8 mostrato su uno sfondo rosso accanto a un'icona a forma di croce rossa con un'assegnazione list.count = 0 sopra di esso\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110245\" class=\"wp-caption-text\">Esempio di TypeError.<\/figcaption><\/figure>\n<p>Per risolvere questo errore, inizializzate il riferimento con un valore prima di accedere alle sue propriet\u00e0. Ecco come appare una volta risolto:<\/p>\n<figure id=\"attachment_110246\" aria-describedby=\"caption-attachment-110246\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110246 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-fixed.png\" alt=\"Impostazione di list.count = 10 dopo l\u2019inizializzazione della lista con {} che d\u00e0 come outuput 10.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110246\" class=\"wp-caption-text\">Come risolvere TypeError.<\/figcaption><\/figure>\n<h3>3. Uncaught TypeError: Cannot Read Property<\/h3>\n<p>Questo \u00e8 uno degli errori pi\u00f9 frequenti in JavaScript: si verifica quando si tenta di leggere una propriet\u00e0 o chiamare una funzione su un oggetto non definito. Potete riprodurlo molto facilmente eseguendo il seguente codice nella console di Chrome Developer:<\/p>\n<pre><code class=\"language-js\">var func\nfunc.call()<\/code><\/pre>\n<p>Ecco l&#8217;output:<\/p>\n<figure id=\"attachment_110249\" aria-describedby=\"caption-attachment-110249\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110249 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error.png\" alt=\"L\u2019errore\u201cUncaught TypeError: Cannot read properties of undefined\u201d \u00e8 mostrato su uno sfondo rosso accanto all'icona di una croce rossa con func.call() sopra di esso.\" width=\"1100\" height=\"162\"><figcaption id=\"caption-attachment-110249\" class=\"wp-caption-text\">Esempio di TypeError con funzione non definita.<\/figcaption><\/figure>\n<p>Un oggetto non definito \u00e8 una delle tante possibili cause di questo errore. Un&#8217;altra causa importante di questo problema pu\u00f2 essere un&#8217;inizializzazione impropria dello stato durante il rendering dell&#8217;UI. Ecco un esempio reale di un&#8217;applicazione React:<\/p>\n<pre><code class=\"language-js\">import React, { useState, useEffect } from \"react\";\n\nconst CardsList = () =&gt; {\n\n    const [state, setState] = useState();\n\n    useEffect(() =&gt; {\n        setTimeout(() =&gt; setState({ items: [\"Card 1\", \"Card 2\"] }), 2000);\n    }, []);\n\n    return (\n        &lt;&gt;\n            {state.items.map((item) =&gt; (\n                &lt;li key={item}&gt;{item}&lt;\/li&gt;\n            ))}\n        &lt;\/&gt;\n    );\n};\n\nexport default CardsList;<\/code><\/pre>\n<p>L&#8217;applicazione inizia con un contenitore di stato vuoto e riceve alcuni elementi dopo un ritardo di 2 secondi. Il ritardo \u00e8 messo in atto per imitare una chiamata di rete. Anche se la vostra rete \u00e8 super veloce, dovrete comunque affrontare un piccolo ritardo a causa del quale il componente verr\u00e0 renderizzato almeno una volta. Se provate a eseguire questa applicazione, riceverete il seguente errore:<\/p>\n<figure id=\"attachment_110234\" aria-describedby=\"caption-attachment-110234\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110234 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/undefined-type-error-output.png\" alt=\"L\u2019errore \u201cundefined is not an object\u201d \u00e8 mostrato su uno sfondo grigio.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110234\" class=\"wp-caption-text\">TypeError stack trace in un browser.<\/figcaption><\/figure>\n<p>Questo perch\u00e9, al momento del rendering, il contenitore di stato \u00e8 indefinito; quindi non esiste alcuna propriet\u00e0 <code>items<\/code> su di esso. Risolvere questo errore \u00e8 facile. Avete solo bisogno di fornire un valore predefinito iniziale al contenitore di stato.<\/p>\n<pre><code class=\"language-js\">\/\/ ...\nconst [state, setState] = useState({items: []});\n\/\/ ...<\/code><\/pre>\n<p>Ora, dopo il ritardo impostato, la vostra app mostrer\u00e0 un output simile:<\/p>\n<figure id=\"attachment_110251\" aria-describedby=\"caption-attachment-110251\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110251 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/cards-list-output.png\" alt=\"Una lista puntata con due elementi, \"Card 1\" e \"Card 2\".\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110251\" class=\"wp-caption-text\">Output del codice.<\/figcaption><\/figure>\n<p>La correzione esatta nel vostro codice potrebbe essere diversa, ma il fulcro qui \u00e8 inizializzare sempre correttamente le vostre variabili prima di usarle.<\/p>\n<h3>4. TypeError: &#8216;undefined&#8217; Is Not an Object<\/h3>\n<p>Questo errore si verifica in Safari quando cercate di accedere alle propriet\u00e0 o chiamare un metodo su un oggetto non definito. Potete eseguire lo stesso codice di cui sopra per riprodurre l&#8217;errore da solo.<\/p>\n<figure id=\"attachment_110250\" aria-describedby=\"caption-attachment-110250\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110250 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error-undefined.png\" alt=\"L\u2019errore \u201cTypeError: undefined is not an object\u201d mostrato su uno sfondo rosso accanto a un'icona rossa a forma di punto esclamativo con sopra la chiamata al metodo func.call().\" width=\"1146\" height=\"172\"><figcaption id=\"caption-attachment-110250\" class=\"wp-caption-text\">Esempio di TypeError con funzione non definita.<\/figcaption><\/figure>\n<p>Anche la soluzione a questo errore \u00e8 la stessa: assicuratevi di aver inizializzato correttamente le vostre variabili e che non siano indefinite quando accedete a una propriet\u00e0 o metodo.<\/p>\n<h3>5. TypeError: null Is Not an Object<\/h3>\n<p>Questo \u00e8 simile all&#8217;errore precedente. Si verifica su Safari e l&#8217;unica differenza tra i due errori \u00e8 che questo viene lanciato quando l&#8217;oggetto alla cui propriet\u00e0 o metodo si sta accedendo \u00e8 <code>null<\/code> invece di <code>undefined<\/code>. Potete riprodurlo eseguendo il codice seguente:<\/p>\n<pre><code class=\"language-js\">var func = null\n\nfunc.call()<\/code><\/pre>\n<p>Ecco l&#8217;output che riceverete:<\/p>\n<figure id=\"attachment_110243\" aria-describedby=\"caption-attachment-110243\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110243 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/null-object-error.png\" alt=\"Il messaggio di errore \"TypeError: null is not an object\", mostrato su uno sfondo rosso accanto all'icona di un punto esclamativo rosso.\" width=\"1146\" height=\"142\"><figcaption id=\"caption-attachment-110243\" class=\"wp-caption-text\">Esempio di TypeError con funzione null.<\/figcaption><\/figure>\n<p><code>null<\/code> \u00e8 un valore impostato esplicitamente su una variabile e non assegnato automaticamente da JavaScript. Questo errore pu\u00f2 verificarsi solo se state cercando di accedere a una variabile che avete impostato voi su <code>null<\/code>. Quindi, dovete rivedere il vostro codice e controllare se la logica che avete scritto \u00e8 corretta o no.<\/p>\n<h3>6. TypeError: Cannot Read Property &#8216;length&#8217;<\/h3>\n<p>Questo errore si verifica in Chrome quando cercate di leggere la lunghezza di un oggetto <code>null<\/code> o <code>undefined<\/code>. La causa di questo problema \u00e8 simile a quelli gi\u00e0 visti, ma si verifica abbastanza frequentemente durante la gestione delle liste; quindi merita una menzione speciale. Ecco come potete riprodurre il problema:<\/p>\n<figure id=\"attachment_110244\" aria-describedby=\"caption-attachment-110244\" style=\"width: 937px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110244 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/myButton-length-type-error.png\" alt=\"L\u2019errore \u201cUncaught TypeError: Cannot read property 'length' of undefined\u201d mostrato su uno sfondo rosso accanto all'icona di una croce rossa con la chiamata myButton.length sopra di esso.\" width=\"937\" height=\"230\"><figcaption id=\"caption-attachment-110244\" class=\"wp-caption-text\">Esempio di TypeError con un oggetto non definito.<\/figcaption><\/figure>\n<p>Tuttavia, nelle versioni pi\u00f9 recenti di Chrome, questo errore viene riportato come <code>Uncaught TypeError: Cannot read properties of undefined<\/code>. Ecco come appare ora:<\/p>\n<figure id=\"attachment_110247\" aria-describedby=\"caption-attachment-110247\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110247 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/length-type-error.png\" alt=\"L\u2019errore \u201cUncaught TypeError: Cannot read properties of undefined\u201d mostrato su uno sfondo rosso accanto all'icona di una croce rossa con la chiamata myButton.length sopra di esso.\" width=\"1400\" height=\"174\"><figcaption id=\"caption-attachment-110247\" class=\"wp-caption-text\">Esempio di TypeError con un oggetto non definito nelle versioni pi\u00f9 recenti di Chrome.<\/figcaption><\/figure>\n<p>La correzione, ancora una volta, consiste nell&#8217;assicurarsi che l&#8217;oggetto alla cui lunghezza state cercando di accedere esista e non sia impostato su <code>null<\/code>.<\/p>\n<h3>7. TypeError: &#8216;undefined&#8217; Is Not a Function<\/h3>\n<p>Questo errore si verifica quando cercate di richiamare un metodo che non esiste nel vostro script, oppure esiste ma non pu\u00f2 essere referenziato nel contesto chiamante. Questo errore di solito si verifica in Google Chrome e potete risolverlo controllando la linea di codice che lancia l&#8217;errore. Se trovate un errore di battitura, correggetelo e controllate se questo risolve il vostro problema.<\/p>\n<p>Se avete usato la parola chiave di autoreferenziazione <code>this<\/code> nel vostro codice, questo errore potrebbe verificarsi se <code>this<\/code> non \u00e8 legata in modo appropriato al vostro contesto. Considerate il seguente codice:<\/p>\n<pre><code class=\"language-js\">function showAlert() {\n    alert(\"message here\")\n}\n\ndocument.addEventListener(\"click\", () =&gt; {\n    this.showAlert();\n})<\/code><\/pre>\n<p>Se eseguite il codice qui sopra, verr\u00e0 lanciato l&#8217;errore di cui abbiamo parlato. Succede perch\u00e9 la funzione anonima passata come event listener viene eseguita nel contesto di <code>document<\/code>.<\/p>\n<p>Al contrario, la funzione <code>showAlert<\/code> \u00e8 definita nel contesto di <code>window<\/code>.<\/p>\n<p>Per risolvere questo problema, dovete passare il riferimento corretto alla funzione legandolo con il metodo <code>bind()<\/code>:<\/p>\n<pre><code class=\"language-js\">document.addEventListener(\"click\", this.showAlert.bind(this))<\/code><\/pre>\n<h3>8. ReferenceError: Event Is Not Defined<\/h3>\n<p>Questo errore si verifica quando cercate di accedere a un riferimento non definito nell&#8217;ambito chiamante. Questo di solito accade quando si gestiscono gli eventi perch\u00e9 spesso vi forniscono un riferimento chiamato <code>event<\/code> nella funzione di callback. Questo errore pu\u00f2 verificarsi se dimenticate di definire l&#8217;argomento dell&#8217;evento nei parametri della vostra funzione o se lo scrivete male.<\/p>\n<p>Questo errore potrebbe non verificarsi in Internet Explorer o Google Chrome (dato che IE offre una variabile di evento globale e Chrome attacca la variabile di evento automaticamente al gestore), ma pu\u00f2 verificarsi in Firefox. Quindi \u00e8 consigliabile tenere d&#8217;occhio questi piccoli errori.<\/p>\n<h3>9. TypeError: Assignment to Constant Variable<\/h3>\n<p>Questo \u00e8 un errore che si verifica per disattenzione. Se provate ad assegnare un nuovo valore a una variabile costante, vi ritroverete con questo risultato:<\/p>\n<figure id=\"attachment_110248\" aria-describedby=\"caption-attachment-110248\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110248 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-type-error.png\" alt=\"L\u2019errore \u201cUncaught TypeError: Assignment to constant variable\u201d mostrato su uno sfondo rosso accanto all'icona di una croce rossa con assegnazione func = 6 sopra di essa.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110248\" class=\"wp-caption-text\">Esempio di TypeError con assegnazione a oggetto costante.<\/figcaption><\/figure>\n<p>Anche se sembra facile da risolvere in questo momento, immaginate centinaia di dichiarazioni di variabili di questo tipo e una di esse definita erroneamente come <code>const<\/code> invece di <code>let<\/code>! <a href=\"https:\/\/kinsta.com\/it\/blog\/php-vs-javascript\/#variable-and-constant-definitions\">A differenza di altri linguaggi di scripting come PHP<\/a>, c&#8217;\u00e8 una differenza minima tra lo stile di dichiarazione delle costanti e delle variabili in JavaScript. Pertanto vi consigliamo di controllare le vostre dichiarazioni prima di tutto quando vi trovate di fronte a questo errore. Potreste anche incorrere in questo errore se <i>dimenticate<\/i> che il suddetto riferimento \u00e8 una costante e lo usate come variabile. Questo indica una disattenzione o un difetto nella logica della vostra applicazione. Assicuratevi di controllarlo quando cercate di risolvere questo problema.<\/p>\n<h3>10. (unknown): Script Error<\/h3>\n<p>Uno script error si verifica quando uno script di terze parti invia un errore al vostro browser. Questo errore \u00e8 seguito da <i>(unknown)<\/i> perch\u00e9 lo script di terze parti appartiene a un dominio diverso dalla vostra applicazione. Il browser nasconde altri dettagli per evitare la fuga di informazioni sensibili dallo script di terze parti.<\/p>\n<p>Non potete risolvere questo errore senza conoscere i dettagli completi. Ecco cosa potete fare per ottenere maggiori informazioni sull&#8217;errore:<\/p>\n<ol>\n<li>Aggiungete l&#8217;attributo <code>crossorigin<\/code> nel tag script.<\/li>\n<li>Impostate l&#8217;intestazione corretta <code>Access-Control-Allow-Origin<\/code> sul server che ospita lo script.<\/li>\n<li>[Opzionale] Se non avete accesso al server che ospita lo script, potete considerare di utilizzare un proxy per inoltrare la vostra richiesta al server e tornare al client con le intestazioni corrette.<\/li>\n<\/ol>\n<p>Una volta che potete accedere ai dettagli dell&#8217;errore, potete poi mettervi a sistemare il problema, che probabilmente sar\u00e0 o con la libreria di terze parti o con la rete.<\/p>\n<h2>Come Identificare e Prevenire gli Errori in JavaScript<\/h2>\n<p>Anche se gli errori discussi sopra sono i pi\u00f9 comuni e frequenti in cui vi imbatterete in JavaScript, basarsi su alcuni esempi non sar\u00e0 mai essere sufficiente. \u00c8 fondamentale capire come individuare e prevenire qualsiasi tipo di errore in un&#8217;applicazione JavaScript mentre la si sviluppa. Ecco come potete gestire gli errori in JavaScript.<\/p>\n<h3>Lanciare e \u2018Catturare\u2019 Manualmente gli Errori<\/h3>\n<p>Il modo base per gestire gli errori che sono stati lanciati manualmente o dal runtime \u00e8 quello di \u2018catturarli\u2019. Come molti altri linguaggi, JavaScript offre una serie di parole chiave per gestire gli errori. \u00c8 essenziale conoscere a fondo ognuna di esse prima di iniziare a gestire gli errori nella vostra applicazione JavaScript.<\/p>\n<h4>throw<\/h4>\n<p>La prima e pi\u00f9 elementare parola chiave dell&#8217;insieme \u00e8 <code>throw<\/code>, che in inglese significa lanciare. Come evidente, la parola chiave throw \u00e8 utilizzata per lanciare errori per creare eccezioni nel runtime JavaScript manualmente. Ne abbiamo gi\u00e0 parlato prima ed ecco il succo del significato di questa parola chiave:<\/p>\n<ul>\n<li>Potete usare <code>throw<\/code> con qualsiasi cosa, compresi i numeri, le stringhe e gli oggetti <code>Error<\/code>.<\/li>\n<li>Tuttavia, non vi consigliamo di lanciare tipi di dati primitivi come stringhe e numeri poich\u00e9 non portano informazioni di debug sugli errori.<\/li>\n<li>Esempio: <code>throw TypeError(\"Please provide a string\")<\/code><\/li>\n<\/ul>\n<h4>try<\/h4>\n<p>La parola chiave <code>try<\/code> \u00e8 utilizzata per indicare che un blocco di codice potrebbe lanciare un&#8217;eccezione. La sua sintassi \u00e8:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ error-prone code here\n}<\/code><\/pre>\n<p>\u00c8 importante notare che un blocco <code>catch<\/code> deve sempre seguire il blocco <code>try<\/code> per gestire efficacemente gli errori.<\/p>\n<h4>catch<\/h4>\n<p>La parola chiave <code>catch<\/code> \u00e8 utilizzata per creare un blocco catch. Questo blocco di codice \u00e8 responsabile della gestione degli errori che il blocco finale <code>try<\/code> cattura. Ecco la sua sintassi:<\/p>\n<pre><code class=\"language-js\">catch (exception) {\n    \/\/ code to handle the exception here\n}<\/code><\/pre>\n<p>E questo \u00e8 il modo in cui si implementano i blocchi <code>try<\/code> e <code>catch<\/code> insieme:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    \/\/ error handling code\n}<\/code><\/pre>\n<p>A differenza di C++ o Java, non potete aggiungere pi\u00f9 blocchi <code>catch<\/code> a un blocco <code>try<\/code> in JavaScript. Questo significa che non potete fare questo:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    }\n} catch (exception) {\n    if (exception instanceof RangeError) {\n    \/\/ do something\n    }\n}<\/code><\/pre>\n<p>Potete invece usare un&#8217;istruzione <code>if...else<\/code> o un&#8217;istruzione switch case all&#8217;interno del singolo blocco catch per gestire tutti i possibili casi di errore. Sarebbe come questo:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    } else if (exception instanceof RangeError) {\n        \/\/ do something else\n    }\n}<\/code><\/pre>\n<h4>finally<\/h4>\n<p>La parola chiave <code>finally<\/code> si usa per definire un blocco di codice che viene eseguito dopo che un errore \u00e8 stato gestito. Questo blocco viene eseguito dopo i blocchi try e catch.<\/p>\n<p>Inoltre, il blocco finally viene eseguito indipendentemente dal risultato degli altri due blocchi. Questo significa che anche se il blocco catch non pu\u00f2 gestire completamente l&#8217;errore o se viene lanciato un errore nel blocco catch, l&#8217;interprete eseguir\u00e0 il codice nel blocco finally prima che il programma vada in crash.<\/p>\n<p>Per essere considerato valido, il blocco try in JavaScript deve essere seguito da un blocco catch o un blocco finally. Senza uno di questi, l&#8217;interprete sollever\u00e0 un SyntaxError. Pertanto, assicuratevi di seguire i vostri blocchi try con almeno uno dei due quando gestite gli errori.<\/p>\n<h3>Gestire gli Errori a Livello Globale con il Metodo onerror()<\/h3>\n<p>Il metodo <code>onerror()<\/code> \u00e8 disponibile per tutti gli elementi HTML e serve a gestire qualsiasi errore che pu\u00f2 verificarsi con essi. Per esempio, se un tag <code>img<\/code> non riesce a trovare l&#8217;immagine il cui URL \u00e8 specificato, questo lancia il suo metodo onerror per permettere all&#8217;utente di gestire l&#8217;errore.<\/p>\n<p>Di solito dovreste fornire un altro URL dell&#8217;immagine nella chiamata onerror per il tag <code>img<\/code>. Ecco come potete farlo tramite JavaScript:<\/p>\n<pre><code class=\"language-js\">const image = document.querySelector(\"img\")\n\nimage.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Tuttavia, potete usare questa funzione per creare un meccanismo globale di gestione degli errori per la vostra applicazione. Ecco come potete farlo:<\/p>\n<pre><code class=\"language-js\">window.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Con questo gestore di eventi, potete sbarazzarvi dei molteplici blocchi <code>try...catch<\/code> sparsi nel vostro codice e centralizzare la gestione degli errori della vostra applicazione in modo simile alla gestione degli eventi. Potete attaccare pi\u00f9 gestori di errori alla finestra per mantenere il principio di responsabilit\u00e0 unica dai principi di progettazione SOLID. L&#8217;interprete passer\u00e0 ciclicamente attraverso tutti i gestori fino a raggiungere quello appropriato.<\/p>\n<h3>Passare gli Errori Tramite Callback<\/h3>\n<p>Mentre le funzioni semplici e lineari permettono alla gestione degli errori di rimanere semplice, le callback possono complicare la faccenda.<\/p>\n<p>Considerate il codice seguente:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n    setTimeout(() =&gt; {\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ncalculateCube(4, callback)<\/code><\/pre>\n<p>La funzione qui sopra dimostra una condizione asincrona in cui una funzione impiega del tempo per elaborare le operazioni e restituisce il risultato pi\u00f9 tardi con l&#8217;aiuto di una callback.<\/p>\n<p>Se provate a inserire una stringa invece di 4 nella chiamata della funzione, otterrete <code>NaN<\/code> come risultato.<\/p>\n<p>Questo deve essere gestito correttamente. Ecco come:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\")\n            throw new Error(\"Numeric argument is expected\")\n\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ntry {\n    calculateCube(4, callback)\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>Questo in teoria dovrebbe risolvere il problema. Tuttavia, se provate a passare una stringa alla chiamata della funzione, riceverete questo:<\/p>\n<figure id=\"attachment_110236\" aria-describedby=\"caption-attachment-110236\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110236 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric-argument.png\" alt=\"L\u2019errore \u201cUncaught Error: Numeric argument is expected\u201d mostrato su uno sfondo rosso scuro accanto all'icona di una croce rossa.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110236\" class=\"wp-caption-text\">Esempio di errore con argomento sbagliato.<\/figcaption><\/figure>\n<p>Anche se avete implementato un blocco try-catch mentre chiamate la funzione, dice che l&#8217;errore non \u00e8 stato gestito, \u00e8 ancora uncaught. L&#8217;errore viene lanciato dopo che il blocco catch \u00e8 stato eseguito a causa del ritardo del timeout.<\/p>\n<p>Questo pu\u00f2 verificarsi rapidamente nelle chiamate di rete, dove si insinuano ritardi imprevisti. Dovete occuparvi di questi casi mentre sviluppate la vostra applicazione.<\/p>\n<p>Ecco come potete gestire correttamente gli errori nelle callback:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\") {\n            callback(new TypeError(\"Numeric argument is expected\"))\n            return\n        }\n        const cube = number * number * number\n        callback(null, cube)\n    }, 2000)\n}\n\nconst callback = (error, result) =&gt; {\n    if (error !== null) {\n        console.log(error)\n        return\n    }\n    console.log(result)\n}\n\ntry {\n    calculateCube('hey', callback)\n} catch (e) {\n    console.log(e)\n}<\/code><\/pre>\n<p>Ora, l&#8217;output nella console sar\u00e0:<\/p>\n<figure id=\"attachment_110238\" aria-describedby=\"caption-attachment-110238\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110238 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-numeric-dark.png\" alt=\"Il messaggio \u201cTypeError: Numeric argument is expected\u201d mostrato su uno sfondo grigio scuro\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110238\" class=\"wp-caption-text\">Esempio di TypeError con argomento non ammesso.<\/figcaption><\/figure>\n<p>Questo indica che l&#8217;errore \u00e8 stato gestito in modo appropriato.<\/p>\n<h3>Gestire gli Errori nelle Promises<\/h3>\n<p>La maggior parte delle persone tende a preferire le <em>promises<\/em> per gestire le attivit\u00e0 asincrone. Le promises hanno un altro vantaggio: una promise rifiutata non termina il vostro script. Tuttavia, avete ancora bisogno di implementare un blocco catch per gestire gli errori nelle promises. Per capire meglio a cosa ci riferiamo, riscriviamo la funzione <code>calculateCube()<\/code> usando le promises:<\/p>\n<pre><code class=\"language-js\">const delay = ms =&gt; new Promise(res =&gt; setTimeout(res, ms));\n\nconst calculateCube = async (number) =&gt; {\n    if (typeof number !== \"number\")\n        throw Error(\"Numeric argument is expected\")\n    await delay(5000)\n    const cube = number * number * number\n    return cube\n}\n\ntry {\n    calculateCube(4).then(r =&gt; console.log(r))\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>Il timeout del codice precedente \u00e8 stato isolato nella funzione <code>delay<\/code> per la comprensione. Se provate a inserire una stringa invece di 4, l&#8217;output che otterrete sar\u00e0 simile a questo:<\/p>\n<figure id=\"attachment_110235\" aria-describedby=\"caption-attachment-110235\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110235 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric.png\" alt=\"L\u2019errore \u201cUncaught (in promise) Error: Numeric argument is expected\u201d mostrato su uno sfondo grigio scuro accanto all'icona di una croce rossa\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110235\" class=\"wp-caption-text\">Esempio di TypeError con un argomento non ammesso in Promise.<\/figcaption><\/figure>\n<p>Di nuovo, questo \u00e8 dovuto al fatto che <code>Promise<\/code> lancia l&#8217;errore dopo che tutto il resto ha completato l&#8217;esecuzione. La soluzione a questo problema \u00e8 semplice. Aggiungete semplicemente una chiamata <code>catch()<\/code> alla catena delle promises come questa:<\/p>\n<pre><code class=\"language-js\">calculateCube(\"hey\")\n.then(r =&gt; console.log(r))\n.catch(e =&gt; console.log(e))<\/code><\/pre>\n<p>Ora l&#8217;output sar\u00e0:<\/p>\n<figure id=\"attachment_110242\" aria-describedby=\"caption-attachment-110242\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110242 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/numeric-argument-error.png\" alt=\"Il messaggio \u201cError: Numeric argument is expected\u201d mostrato su uno sfondo grigio scuro\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110242\" class=\"wp-caption-text\">Esempi di gestione di un TypeError con argomento non ammesso.<\/figcaption><\/figure>\n<p>Come vedete \u00e8 abbastanza facile gestire gli errori con le promises. Inoltre, potete concatenare un blocco <code>finally()<\/code> e la chiamata alla promise per aggiungere codice che verr\u00e0 eseguito dopo che la gestione dell&#8217;errore \u00e8 stata completata.<\/p>\n<p>In alternativa, potete anche gestire gli errori nelle promises usando la tradizionale tecnica try-catch-finally. Ecco come sarebbe la vostra chiamata a promise in questo caso:<\/p>\n<pre><code class=\"language-js\">try {\n    let result = await calculateCube(\"hey\")\n    console.log(result)\n} catch (e) {\n    console.log(e)\n} finally {\n    console.log('Finally executed\")\n}<\/code><\/pre>\n<p>Tuttavia, questo funziona solo all&#8217;interno di una funzione asincrona. Quindi il modo migliore per gestire gli errori nelle promises \u00e8 quello di concatenare <code>catch<\/code> e <code>finally<\/code> alla chiamata della promise.<\/p>\n<h3>throw\/catch vs onerror() vs Callback vs Promises: Qual \u00c8 il Migliore?<\/h3>\n<p>Avendo quattro metodi a disposizione, dovete sapere quale scegliere il pi\u00f9 appropriato a seconda del caso d&#8217;uso. Ecco come potete decidere:<\/p>\n<h4>throw\/catch<\/h4>\n<p>Userete questo metodo la maggior parte delle volte. Assicuratevi di implementare le condizioni per tutti i possibili errori all&#8217;interno del vostro blocco catch, e ricordatevi di includere un blocco finally se avete bisogno di eseguire alcune routine di pulizia della memoria dopo il blocco try.<\/p>\n<p>Tuttavia, troppi blocchi try\/catch possono rendere il vostro codice difficile da mantenere. Se vi trovate in una situazione del genere, potreste voler gestire gli errori tramite il gestore globale o il metodo promise.<\/p>\n<p>Quando si decide tra i blocchi asincroni try\/catch e la promise <code>catch()<\/code>, \u00e8 consigliabile optare per i blocchi asincroni try\/catch perch\u00e9 renderanno il vostro codice lineare e facile da eseguire il debug.<\/p>\n<h4>onerror()<\/h4>\n<p>\u00c8 meglio usare il metodo <code>onerror()<\/code> quando sapete che la vostra applicazione deve gestire molti errori e questi possono essere sparsi lungo tutto il codice. Il metodo <code>onerror<\/code> vi permette di gestire gli errori come se fossero un altro evento gestito dalla vostra applicazione. Potete definire pi\u00f9 gestori di errori e inserirli nella finestra della vostra applicazione durante il rendering iniziale.<\/p>\n<p>Tuttavia, dovete anche ricordare che il metodo <code>onerror()<\/code> pu\u00f2 essere inutilmente impegnativo da impostare in progetti pi\u00f9 piccoli con una minore portata di errore. Se avete la certezza che la vostra app non lancer\u00e0 troppi errori, il metodo tradizionale throw\/catch funzioner\u00e0 meglio per voi.<\/p>\n<h4>Callback e Promises<\/h4>\n<p>La gestione degli errori nei callback e nelle promises differisce a causa del design e della struttura del codice. Tuttavia, se scegliete tra questi due prima di aver scritto il vostro codice, sarebbe meglio optare per le promises.<\/p>\n<p>Questo perch\u00e9 le promises hanno un costrutto incorporato per concatenare un <code>catch()<\/code> e un blocco <code>finally()<\/code> per gestire facilmente gli errori. Questo metodo \u00e8 pi\u00f9 facile e pulito che definire argomenti aggiuntivi\/riutilizzare argomenti esistenti per gestire gli errori.<\/p>\n<h3>Tenere Traccia dei Cambiamenti con i Repository Git<\/h3>\n<p>Molti errori sorgono spesso a causa di errori manuali nel codice. Durante lo sviluppo o il debug del vostro codice, potreste finire per fare cambiamenti non necessari che potrebbero causare nuovi errori nella vostra codebase. I <a href=\"https:\/\/kinsta.com\/it\/docs\/hosting-wordpress\/wordpress-riferimenti\/domande-frequenti-tecniche\/\">test automatici<\/a> sono un ottimo modo per tenere sotto controllo il vostro codice dopo ogni cambiamento. Tuttavia, pu\u00f2 solo dirvi se qualcosa \u00e8 sbagliato. Se non fate frequenti backup del vostro codice, finirete per perdere tempo cercando di sistemare una funzione o uno script che prima funzionava benissimo.<\/p>\n<p>\u00c8 qui che Git gioca la sua parte. Con una corretta strategia di commit, potete usare la vostra cronologia git come un sistema di backup per vedere in che modo si \u00e8 evoluto il vostro codice durante lo sviluppo. Potete facilmente sfogliare i vostri vecchi commit e scoprire la versione della funzione che prima funzionava bene ma che ha dato errori dopo un cambiamento non correlato.<\/p>\n<p>Potete quindi ripristinare il vecchio codice o confrontare le due versioni per determinare cosa \u00e8 andato storto. I moderni <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-sviluppo-web\/\">strumenti di sviluppo web<\/a> come <a href=\"https:\/\/kinsta.com\/it\/blog\/cosa-e-github\/\">GitHub<\/a> Desktop o GitKraken vi aiutano a visualizzare questi cambiamenti fianco a fianco e a capire gli errori rapidamente.<\/p>\n<p>Un&#8217;abitudine che pu\u00f2 aiutarvi a fare meno errori \u00e8 quella di eseguire <a href=\"https:\/\/kinsta.com\/it\/blog\/strumenti-di-revisione-del-codice\/\">revisioni del codice<\/a> ogni volta che fate un cambiamento significativo al vostro codice. Se state lavorando in un team, potete creare una richiesta di pull e farla revisionare da una persona del team. Questo vi aiuter\u00e0 a fidarvi di un secondo paio di occhi per individuare eventuali errori che potrebbero esservi sfuggiti.<\/p>\n<h2>Migliori Pratiche per Gestire gli Errori in JavaScript<\/h2>\n<p>I metodi sopra menzionati sono l\u2019ideale per progettare un robusto approccio di gestione degli errori per la vostra prossima applicazione JavaScript. Tuttavia, sarebbe meglio tenere alcune cose in mente mentre li implementate per ottenere il meglio dalla vostra gestione degli errori. Ecco alcuni suggerimenti.<\/p>\n<h3>1. Usare gli Errori Personalizzati Quando Si Gestiscono le Eccezioni Operative<\/h3>\n<p>Abbiamo introdotto gli errori personalizzati all&#8217;inizio di questa guida per darvi un&#8217;idea di come personalizzare la gestione degli errori per il caso unico della vostra applicazione. \u00c8 consigliabile usare gli errori personalizzati quando possibile invece della classe generica <code>Error<\/code> in quanto fornisce pi\u00f9 informazioni contestuali all&#8217;ambiente chiamante sull&#8217;errore.<\/p>\n<p>Inoltre, gli errori personalizzati vi permettono di moderare il modo in cui un errore viene mostrato all&#8217;ambiente chiamante. Questo significa che potete scegliere di nascondere dettagli specifici o mostrare informazioni aggiuntive sull&#8217;errore come e quando volete.<\/p>\n<p>Potete arrivare a formattare il contenuto dell&#8217;errore secondo le vostre esigenze. Questo vi d\u00e0 un migliore controllo su come l&#8217;errore viene interpretato e gestito.<\/p>\n<h3>2. Non Ammettere Nessuna Eccezione<\/h3>\n<p>Anche le persone pi\u00f9 esperte di sviluppo spesso fanno un errore da principianti: consumare tutti i livelli di eccezioni nel corso del codice.<\/p>\n<p>Potreste imbattervi in situazioni in cui avete un pezzo di codice da eseguire in modo opzionale. Se funziona, bene; se non funziona, non c&#8217;\u00e8 bisogno di fare nulla.<\/p>\n<p>In questi casi, si \u00e8 spesso tentati di mettere questo codice in un blocco try e allegarvi un blocco catch vuoto. Tuttavia, facendo cos\u00ec lascerete quel pezzo di codice libero di causare <i>qualsiasi<\/i> tipo di errore e farla franca. Questo pu\u00f2 diventare pericoloso se avete una codebase grande e molte istanze di questi costrutti di gestione degli errori.<\/p>\n<p>Il modo migliore per gestire le eccezioni \u00e8 quello di determinare un livello in cui saranno trattate tutte e raccoglierle fino a quel punto. Questo livello pu\u00f2 essere un controller (in un&#8217;app con architettura MVC) o un middleware (in un&#8217;app tradizionale orientata al server).<\/p>\n<p>In questo modo saprete dove trovare tutti gli errori che si verificano nella vostra app e scegliere come risolverli, anche se questo significa non fare nulla.<\/p>\n<h3>3. Usare una Strategia Centralizzata per i Log e gli Avvisi di Errore<\/h3>\n<p>La registrazione di un errore \u00e8 spesso parte integrante della sua gestione. Coloro che non riescono a sviluppare una strategia centralizzata per la registrazione degli errori possono perdere informazioni preziose sull&#8217;utilizzo della loro applicazione.<\/p>\n<p>I registri degli eventi di un&#8217;app possono aiutarvi a capire dati cruciali sugli errori e aiutarvi a fare il debug rapidamente. Se avete dei meccanismi di allarme adeguati impostati nella vostra app, potete sapere quando si verifica un errore nella vostra app prima che raggiunga una grande parte della vostra base di utenti.<\/p>\n<p>\u00c8 consigliabile usare un logger pre-costruito o crearne uno per soddisfare le vostre esigenze. Potete configurare questo logger per gestire gli errori in base ai loro livelli (warning, debug, info, ecc.) e alcuni logger arrivano addirittura a inviare immediatamente i log ai server di registrazione remoti. In questo modo, potete osservare come la logica della vostra applicazione si comporta con gli utenti attivi.<\/p>\n<h3>4. Notificare agli Utenti gli Errori in Modo Appropriato<\/h3>\n<p>Un altro buon punto da ricordare quando definite la vostra strategia di gestione degli errori \u00e8 quello di tenere sempre a mente l&#8217;utente.<\/p>\n<p>Tutti gli errori che interferiscono con il normale funzionamento della vostra applicazione devono presentare un avviso visibile per notificare agli utenti che qualcosa \u00e8 andato storto, in modo che loro possano provare a trovare una soluzione. Se conoscete una soluzione rapida per l&#8217;errore, come riprovare un&#8217;operazione o fare il logout e il login, assicuratevi di menzionarla nel messaggio di avviso per aiutare a risolvere l&#8217;esperienza dell&#8217;utente in tempo reale.<\/p>\n<p>Nel caso di errori che non causano alcuna interferenza con l&#8217;esperienza quotidiana dell&#8217;utente, potete considerare di sopprimere l&#8217;avviso e registrare l&#8217;errore su un server remoto per risolverlo in seguito.<\/p>\n<h3>5. Implementare un Middleware (Node.js)<\/h3>\n<p><a href=\"https:\/\/kinsta.com\/it\/blog\/node-js\/\">L&#8217;ambiente Node.js<\/a> supporta i middleware per aggiungere funzionalit\u00e0 alle applicazioni server. Potete usare questa caratteristica per creare un middleware di gestione degli errori per il vostro server.<\/p>\n<p>Il vantaggio pi\u00f9 significativo dell&#8217;utilizzo del middleware \u00e8 che tutti i vostri errori sono gestiti centralmente in un unico posto. Potete scegliere di attivare\/disattivare questa configurazione per scopi di test facilmente.<\/p>\n<p>Ecco come potete creare un middleware di base:<\/p>\n<pre><code class=\"language-js\">const logError = err =&gt; {\n    console.log(\"ERROR: \" + String(err))\n}\n\nconst errorLoggerMiddleware = (err, req, res, next) =&gt; {\n    logError(err)\n    next(err)\n}\n\nconst returnErrorMiddleware = (err, req, res, next) =&gt; {\n    res.status(err.statusCode || 500)\n       .send(err.message)\n}\n\nmodule.exports = {\n    logError,\n    errorLoggerMiddleware,\n    returnErrorMiddleware\n}<\/code><\/pre>\n<p>Potete poi usare questo middleware nella vostra app in questo modo:<\/p>\n<pre><code class=\"language-js\">const { errorLoggerMiddleware, returnErrorMiddleware } = require('.\/errorMiddleware')\n\napp.use(errorLoggerMiddleware)\n\napp.use(returnErrorMiddleware)<\/code><\/pre>\n<p>Ora potete definire una logica personalizzata all&#8217;interno del middleware per gestire gli errori in modo appropriato. Non avete pi\u00f9 bisogno di preoccuparvi di implementare singoli costrutti di gestione degli errori in tutto il vostro codice.<\/p>\n<h3>6. Riavviare la Vostra App per Gestire gli Errori di Programmazione (Node.js)<\/h3>\n<p>Quando le app Node.js incontrano errori di programmazione, potrebbero non lanciare un&#8217;eccezione e provare a chiudere l&#8217;app. Tali errori possono includere problemi derivanti da errori di programmazione, come l&#8217;alto consumo di CPU, riempimento della memoria o le perdite di memoria. Il modo migliore per gestirli \u00e8 quello di riavviare l&#8217;app mandandola in crash tramite la modalit\u00e0 cluster di Node.js o uno strumento unico come PM2. Questo pu\u00f2 garantire che l&#8217;app non vada in crash su azione dell&#8217;utente, presentando un&#8217;esperienza utente terribile.<\/p>\n<h3>7. Trovare Tutte le Eccezioni Non Contemplate (Node.js)<\/h3>\n<p>Non avrete mai la certezza di aver pensato a ogni possibile errore che pu\u00f2 verificarsi nella vostra app. Pertanto, \u00e8 essenziale implementare una strategia di ripiego per trovare tutte le eccezioni non contemplate dalla vostra app.<\/p>\n<p>Ecco come potete farlo:<\/p>\n<pre><code class=\"language-js\">process.on('uncaughtException', error =&gt; {\n    console.log(\"ERROR: \" + String(error))\n    \/\/ other handling mechanisms\n})<\/code><\/pre>\n<p>Potete anche capire se l&#8217;errore che si \u00e8 verificato \u00e8 un&#8217;eccezione standard o un errore operativo personalizzato. In base al risultato, potete uscire dal processo e riavviarlo per evitare un comportamento inaspettato.<\/p>\n<h3>8. Trovare Tutti i Casi Non Gestiti di Promises Respinte (Node.js)<\/h3>\n<p>Cos\u00ec come non potrete mai pensare in anticipo a tutte le possibili eccezioni, c&#8217;\u00e8 un&#8217;alta possibilit\u00e0 di non gestire tutti le promises respinte. Tuttavia, a differenza delle eccezioni, le promises respinte non generano errori.<\/p>\n<p>Quindi, una promise importante che viene respinta potrebbe sfuggire e lasciare la vostra applicazione aperta alla possibilit\u00e0 di incorrere in un comportamento inaspettato. Pertanto, \u00e8 fondamentale implementare un meccanismo di fallback per gestire le promises respinte.<\/p>\n<p>Ecco come potete farlo:<\/p>\n<pre><code class=\"language-js\">const promiseRejectionCallback = error =&gt; {\n    console.log(\"PROMISE REJECTED: \" + String(error))\n}\n\nprocess.on('unhandledRejection', callback)<\/code><\/pre>\n\n<h2>Riepilogo<\/h2>\n<p>Come capita con qualsiasi altro linguaggio di programmazione, gli errori sono abbastanza frequenti e naturali in JavaScript. In alcuni casi, potreste anche aver bisogno di lanciare errori intenzionalmente per indicare la risposta corretta ai vostri utenti. Quindi, capire la loro anatomia e le varie tipologie di errore \u00e8 cruciale.<\/p>\n<p>Inoltre, dovete avere gli strumenti e le tecniche giuste per identificare ed evitare che gli errori distruggano la vostra applicazione.<\/p>\n<p>Nella maggior parte dei casi, una solida strategia per gestire gli errori con un&#8217;attenta esecuzione \u00e8 sufficiente per tutti i tipi di applicazioni JavaScript.<\/p>\n<p><em>Ci sono altri errori JavaScript che non ancora non hai potuto risolvere? Avete tecniche da consigliare per gestire gli errori JS in modo costruttivo? Fatecelo sapere nei commenti qui sotto!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La legge di Murphy afferma che tutto ci\u00f2 che pu\u00f2 andare male alla fine andr\u00e0 male. Questo si applica molto bene al mondo della programmazione. Se &#8230;<\/p>\n","protected":false},"author":238,"featured_media":51582,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[25552,25648,67],"topic":[25890,26237,25847],"class_list":["post-51581","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-development","tag-javascript","tag-webdev","topic-errori-del-sito","topic-errori-javascript","topic-tutorial-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Guida Definitiva alla Gestione degli Errori in JavaScript<\/title>\n<meta name=\"description\" content=\"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Guida Definitiva alla Gestione degli Errori in JavaScript\" \/>\n<meta property=\"og:description\" content=\"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstaitalia\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-08T13:06:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-09T15:42:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kumar Harsh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_IT\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"33 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Guida Definitiva alla Gestione degli Errori in JavaScript\",\"datePublished\":\"2022-02-08T13:06:01+00:00\",\"dateModified\":\"2023-06-09T15:42:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\"},\"wordCount\":6107,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg\",\"keywords\":[\"development\",\"JavaScript\",\"webdev\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\",\"url\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\",\"name\":\"Guida Definitiva alla Gestione degli Errori in JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg\",\"datePublished\":\"2022-02-08T13:06:01+00:00\",\"dateModified\":\"2023-06-09T15:42:25+00:00\",\"description\":\"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg\",\"width\":1460,\"height\":730,\"caption\":\"Una guida definitiva alla gestione degli errori in JavaScript\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial JavaScript\",\"item\":\"https:\/\/kinsta.com\/it\/argomenti\/tutorial-javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Guida Definitiva alla Gestione degli Errori in JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/it\/#website\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluzioni di hosting premium, veloci e sicure\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/it\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/it\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/it\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstaitalia\/\",\"https:\/\/x.com\/Kinsta_IT\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"caption\":\"Kumar Harsh\"},\"description\":\"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.\",\"sameAs\":[\"https:\/\/kumarharsh.me\"],\"url\":\"https:\/\/kinsta.com\/it\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Guida Definitiva alla Gestione degli Errori in JavaScript","description":"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/","og_locale":"it_IT","og_type":"article","og_title":"Guida Definitiva alla Gestione degli Errori in JavaScript","og_description":"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.","og_url":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstaitalia\/","article_published_time":"2022-02-08T13:06:01+00:00","article_modified_time":"2023-06-09T15:42:25+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.","twitter_image":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg","twitter_creator":"@Kinsta_IT","twitter_site":"@Kinsta_IT","twitter_misc":{"Scritto da":"Kumar Harsh","Tempo di lettura stimato":"33 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Guida Definitiva alla Gestione degli Errori in JavaScript","datePublished":"2022-02-08T13:06:01+00:00","dateModified":"2023-06-09T15:42:25+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/"},"wordCount":6107,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg","keywords":["development","JavaScript","webdev"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/","url":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/","name":"Guida Definitiva alla Gestione degli Errori in JavaScript","isPartOf":{"@id":"https:\/\/kinsta.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg","datePublished":"2022-02-08T13:06:01+00:00","dateModified":"2023-06-09T15:42:25+00:00","description":"Stai riscontrando errori nel tuo JavaScript? Ti mostriamo come domarli in modo che tu possa tornare allo sviluppo del tuo progetto.","breadcrumb":{"@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#primaryimage","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2022\/01\/errors-in-javascript.jpg","width":1460,"height":730,"caption":"Una guida definitiva alla gestione degli errori in JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/it\/blog\/errori-in-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/it\/"},{"@type":"ListItem","position":2,"name":"Tutorial JavaScript","item":"https:\/\/kinsta.com\/it\/argomenti\/tutorial-javascript\/"},{"@type":"ListItem","position":3,"name":"Guida Definitiva alla Gestione degli Errori in JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/it\/#website","url":"https:\/\/kinsta.com\/it\/","name":"Kinsta\u00ae","description":"Soluzioni di hosting premium, veloci e sicure","publisher":{"@id":"https:\/\/kinsta.com\/it\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/it\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/it\/","logo":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/it\/wp-content\/uploads\/sites\/2\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/it\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstaitalia\/","https:\/\/x.com\/Kinsta_IT","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/kinsta.com\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","caption":"Kumar Harsh"},"description":"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.","sameAs":["https:\/\/kumarharsh.me"],"url":"https:\/\/kinsta.com\/it\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/51581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/comments?post=51581"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/51581\/revisions"}],"predecessor-version":[{"id":60641,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/posts\/51581\/revisions\/60641"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/de"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/translations\/jp"},{"href":"https:\/\/kinsta.com\/it\/wp-json\/kinsta\/v1\/posts\/51581\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media\/51582"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/media?parent=51581"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/tags?post=51581"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/it\/wp-json\/wp\/v2\/topic?post=51581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}