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("https://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