ARGOMENTO about_Try_Catch_Finally DESCRIZIONE BREVE Descrive come utilizzare i blocchi Try, Catch e Finally per gestire gli errori fatali. DESCRIZIONE DETTAGLIATA Utilizzare i blocchi Try, Catch e Finally per rispondere o gestire gli errori fatali negli script. Anche l'istruzione Trap può essere utilizzata per gestire gli errori fatali negli script. Per ulteriori informazioni, vedere about_Trap. Un errore fatale arresta l'esecuzione di un'istruzione. In Windows PowerShell, se un errore fatale non viene gestito in qualche modo, la funzione o lo script vengono anche arrestati mediante la pipeline corrente. Negli altri linguaggi, ad esempio C#, gli errori fatali vengono definiti eccezioni. Per ulteriori informazioni sugli errori, vedere about_Errors. Utilizzare il blocco Try per definire una sezione di uno script nella quale si desidera che vengano monitorati gli errori. Quando si verifica un errore nel blocco Try, l'errore viene innanzitutto salvato nella variabile automatica $Error. Viene quindi cercato un blocco Catch per gestire l'errore. Se l'istruzione Try non dispone di un blocco Catch corrispondente, si continua a cercare un blocco Catch adatto o un'istruzione Trap negli ambiti padre. Una volta completato un blocco Catch oppure se non viene trovato un blocco Catch o un'istruzione Trap appropriata, viene eseguito il blocco Finally. Se l'errore non può essere gestito, viene scritto nel flusso di errore. Un blocco Catch può includere comandi per la registrazione dell'errore o per il recupero del flusso previsto dello script. Un blocco Catch può specificare quali tipi di errori intercetta. Un'istruzione Try può includere più blocchi Catch per tipi diversi di errori. Un blocco Finally può essere utilizzato per liberare risorse non più necessarie allo script. Try, Catch e Finally sono analoghi alle parole chiave Try, Catch e Finally utilizzate nel linguaggio di programmazione C#. Sintassi Un'istruzione Try contiene un blocco Try, zero o più blocchi Catch e zero o un blocco Finally. Un'istruzione Try deve disporre almeno di un blocco Catch o e di un blocco Finally. Di seguito viene illustrata la sintassi del blocco Try: try {<elenco istruzioni>} La parola chiave Try viene seguita da un elenco di istruzioni tra parentesi graffe. Se si verifica un errore fatale mentre le istruzioni nell'elenco di istruzioni sono in esecuzione, lo script passa l'oggetto errore dal blocco Try a un blocco Catch appropriato. Di seguito viene illustrata la sintassi del blocco Catch: catch [[<tipo di errore>][',' <error type>]*] {<elenco istruzioni>} I tipi di errore vengono riportati tra parentesi quadre. Le parentesi quadre più esterne indicano che l'elemento è facoltativo. La parola chiave Catch viene seguita da un elenco facoltativo di specifiche del errore tipo e da un elenco di istruzioni. Se si verifica un errore fatale nel blocco Try, viene cercato un blocco Catch appropriato. Se viene trovato, vengono eseguite le istruzioni nel blocco Catch. Il blocco Catch può specificare uno o più tipi di errore. Un tipo di errore è un'eccezione Microsoft .NET Framework o un'eccezione derivata da un'eccezione .NET Framework. Un blocco Catch gestisce gli errori della classe di eccezioni .NET Framework o di qualsiasi classe derivata dalla classe specificata. Se un blocco Catch specifica un tipo di errore, tale blocco Catch gestisce tale tipo di errore. Se un blocco Catch non specifica un tipo di errore, tale blocco Catch gestisce qualsiasi errore rilevato nel blocco Try. Un'istruzione Try può includere più blocchi Catch per i tipi diversi di errori specificati. Di seguito viene illustrata la sintassi del blocco Finally: finally {<elenco istruzioni>} La parola chiave Finally è seguita da un elenco di istruzioni eseguito ogni volta che viene eseguito lo script, anche se l'istruzione Try viene eseguita senza errori o se un errore viene intercettato in un'istruzione Catch. Notare che premendo CTRL+C si arresta la pipeline. Gli oggetti inviati alla pipeline non saranno visualizzati come output. Pertanto, se si include un'istruzione da visualizzare, ad esempio "Blocco Finally eseguito", non sarà visualizzata dopo avere premuto CTRL+C, anche se il Finally è stato eseguito. Intercettamento di errori Nello script di esempio seguente è riportato un blocco Try con un blocco Catch: try { NonsenseString } catch { "Si è verificato un errore." } La parola chiave Catch deve seguire immediatamente il blocco Try o un altro blocco Catch. Windows PowerShell non riconosce "NonsenseString" come un cmdlet o altro elemento. L'esecuzione di questo script restituisce il risultato seguente: Si è verificato un errore. Quando lo script rileva "NonsenseString", causa un errore fatale. Il blocco Catch gestisce l'errore eseguendo l'elenco di istruzioni nel blocco. Utilizzo di più istruzioni Catch Un'istruzione Try può disporre di qualsiasi numero di blocchi Catch. Ad esempio, lo script seguente contiene un blocco Try che scarica il file MyFile.doc e contiene due blocchi Catch: try { $wc = new-object System.Net.WebClient $wc.DownloadFile("http://www.contoso.com/MyDoc.doc") } catch [System.Net.WebException],[System.IO.IOException] { "Impossibile scaricare MyDoc.doc da http://www.contoso.c om." } catch { "Si è verificato un errore che non è stato possibile risolvere." } Il primo blocco Catch gestisce gli errori dei tipi System.Net.WebException e System.IO.IOException. Il secondo blocco Catch non specifica un tipo di errore. Il secondo blocco Catch gestisce gli altri errori fatali che si verificano. Vengono rilevati i tipi di errori per ereditarietà. Un blocco Catch gestisce gli errori della classe di eccezioni .NET Framework o di qualsiasi classe derivata dalla classe specificata. L'esempio seguente contiene un blocco Catch che intercetta un errore "Command Not Found": catch [System.Management.Automation.CommandNotFoundException] {"Eccezione ereditata" } Il tipo di errore specificato, CommandNotFoundException, eredita dal tipo System.SystemException. Anche l'esempio seguente intercetta un errore Command Not Found: catch [System.SystemException] {"Eccezione di base" } Questo blocco Catch gestisce l'errore "Command Not Found" e altri errori che ereditano dal tipo SystemException. Se si specifica una classe di errore e una delle classi derivate, inserire il blocco Catch per le classi derivate prima del blocco Catch per la classe generale. Liberare risorse mediante il blocco Finally Per liberare le risorse utilizzate da uno script, aggiungere un blocco Finally dopo i blocchi Try e Catch. Le istruzioni del blocco Finally vengono eseguite indipendentemente dal fatto che il blocco Try rilevi un errore fatale. Il blocco Finally viene eseguito prima che lo script venga terminato o prima che il blocco corrente esca dall'ambito. Il blocco Finally viene eseguito anche se si utilizza CTRL+C per arrestare lo script. Un blocco Finally anche se una parola chiave Exit arresta lo script all'interno di un blocco Catch. VEDERE ANCHE about_Errors about_Trap