about_Try_Catch_Finally
Descrizione breve
Viene descritto come usare i try
blocchi , catch
e finally
per gestire gli errori di terminazione.
Descrizione lunga
Usare try
i blocchi , catch
e finally
per rispondere o gestire gli errori di terminazione negli script. L'istruzione Trap
può essere usata anche per gestire gli errori di terminazione negli script. Per altre informazioni, vedere about_Trap.
Un errore irreversibile impedisce l'esecuzione di un'istruzione. Se PowerShell non gestisce in qualche modo un errore irreversibile, PowerShell interrompe anche l'esecuzione della funzione o dello script usando la pipeline corrente. In altri linguaggi, ad esempio C#, gli errori di terminazione vengono definiti eccezioni.
Usare il try
blocco per definire una sezione di uno script in cui si vuole che PowerShell monitori gli errori. Quando si verifica un errore all'interno del try
blocco, l'errore viene prima salvato nella $Error
variabile automatica. PowerShell cerca quindi un catch
blocco per gestire l'errore. Se l'istruzione try
non dispone di un blocco corrispondentecatch
, PowerShell continua a cercare un blocco o Trap
un'istruzione appropriata catch
negli ambiti padre. Dopo il completamento di un catch
blocco o se non viene trovata alcuna istruzione o Trap
blocco appropriatocatch
, il finally
blocco viene eseguito. Se l'errore non può essere gestito, l'errore viene scritto nel flusso di errori.
Un catch
blocco può includere comandi per tenere traccia dell'errore o per ripristinare il flusso previsto dello script. Un catch
blocco può specificare quali tipi di errore intercetta. Un'istruzione try
può includere più catch
blocchi per diversi tipi di errori.
Un finally
blocco può essere usato per liberare tutte le risorse che non sono più necessarie per lo script.
try
, catch
e finally
sono simili alle try
parole chiave , catch
e finally
usate nel linguaggio di programmazione C#.
Sintassi
Un'istruzione try
contiene un try
blocco, zero o più catch
blocchi e zero o un finally
blocco. Un'istruzione try
deve avere almeno un catch
blocco o un finally
blocco.
Di seguito è illustrata la sintassi del try
blocco:
try {<statement list>}
La try
parola chiave è seguita da un elenco di istruzioni tra parentesi graffe. Se si verifica un errore irreversibile durante l'esecuzione delle istruzioni nell'elenco di istruzioni, lo script passa l'oggetto errore dal try
blocco a un blocco appropriato catch
.
Di seguito è illustrata la sintassi del catch
blocco:
catch [[<error type>][',' <error type>]*] {<statement list>}
I tipi di errore vengono visualizzati tra parentesi quadre. Le parentesi quadre più esterne indicano che l'elemento è facoltativo.
La catch
parola chiave è seguita da un elenco facoltativo di specifiche del tipo di errore e da un elenco di istruzioni. Se si verifica un errore irreversibile nel try
blocco, PowerShell cerca un blocco appropriato catch
. Se ne viene trovata una, vengono eseguite le istruzioni nel catch
blocco.
Il catch
blocco può specificare uno o più tipi di errore. Un tipo di errore è un'eccezione di Microsoft .NET Framework o un'eccezione derivata da un'eccezione di .NET Framework. Un catch
blocco gestisce gli errori della classe di eccezione .NET Framework specificata o di qualsiasi classe che deriva dalla classe specificata.
Se un blocco specifica un catch
tipo di errore, tale catch
blocco gestisce tale tipo di errore. Se un blocco non specifica un catch
tipo di errore, il catch
blocco gestisce qualsiasi errore rilevato nel try
blocco. Un'istruzione try
può includere più catch
blocchi per i diversi tipi di errore specificati.
Di seguito è illustrata la sintassi del finally
blocco:
finally {<statement list>}
La finally
parola chiave è seguita da un elenco di istruzioni eseguito ogni volta che viene eseguito lo script, anche se l'istruzione try
è stata eseguita senza errori o se è stato rilevato un errore in un'istruzione catch
.
Si noti che premendo CTRL+C si arresta la pipeline. Gli oggetti inviati alla pipeline non verranno visualizzati come output. Pertanto, se si include un'istruzione da visualizzare, ad esempio "Finally block has run", non verrà visualizzata dopo aver premuto CTRL+C, anche se il finally
blocco è stato eseguito.
Rilevamento degli errori
Lo script di esempio seguente mostra un try
blocco con un catch
blocco:
try { NonsenseString }
catch { "An error occurred." }
La catch
parola chiave deve seguire immediatamente il try
blocco o un altro catch
blocco.
PowerShell non riconosce "NonsenseString" come cmdlet o un altro elemento. L'esecuzione di questo script restituisce il risultato seguente:
An error occurred.
Quando lo script rileva "NonsenseString", genera un errore irreversibile. Il catch
blocco gestisce l'errore eseguendo l'elenco di istruzioni all'interno del blocco.
Uso di più istruzioni catch
Un'istruzione try
può avere un numero qualsiasi di catch
blocchi. Ad esempio, lo script seguente include un try
blocco che scarica MyDoc.doc
e contiene due catch
blocchi:
try {
$wc = new-object System.Net.WebClient
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
"An error occurred that could not be resolved."
}
Il primo catch
blocco gestisce gli errori dei tipi System.Net.WebException e System.IO.IOException . Il secondo catch
blocco non specifica un tipo di errore. Il secondo catch
blocco gestisce eventuali altri errori irreversibili che si verificano.
PowerShell corrisponde ai tipi di errore in base all'ereditarietà. Un catch
blocco gestisce gli errori della classe di eccezione .NET Framework specificata o di qualsiasi classe che deriva dalla classe specificata. L'esempio seguente contiene un catch
blocco che rileva un errore "Comando non trovato":
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
Il tipo di errore specificato, CommandNotFoundException, eredita dal tipo System.SystemException . L'esempio seguente rileva anche un errore Command Not Found:
catch [System.SystemException] {"Base Exception" }
Questo catch
blocco gestisce l'errore "Comando non trovato" e altri errori che ereditano dal tipo SystemException .
Se si specifica una classe di errore e una delle relative classi derivate, posizionare il catch
blocco per la classe derivata prima del catch
blocco per la classe generale.
Nota
PowerShell esegue il wrapping di tutte le eccezioni in un tipo RuntimeException . Pertanto, specificando il tipo di errore System.Management.Automation.RuntimeException si comporta come un blocco catch non qualificato.
Uso di trappole in un tentativo catch
Quando si verifica un errore di terminazione in un try
blocco con un Trap
oggetto definito all'interno del try
blocco, anche se è presente un blocco corrispondente catch
, l'istruzione Trap
acquisisce il controllo.
Trap
Se un oggetto esiste in un blocco superiore a try
e non esiste alcun blocco corrispondente catch
all'interno dell'ambito corrente, Trap
assumerà il controllo, anche se un ambito padre ha un blocco corrispondentecatch
.
Accesso alle informazioni sulle eccezioni
All'interno di un catch
blocco, è possibile accedere all'errore corrente usando $_
, noto anche come $PSItem
. L'oggetto è di tipo ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
L'esecuzione di questo script restituisce il risultato seguente:
An Error occurred:
The term 'NonsenseString' is not recognized as the name of a cmdlet, function,
script file, or operable program. Check the spelling of the name, or if a path
was included, verify that the path is correct and try again.
È possibile accedere a proprietà aggiuntive, ad esempio ScriptStackTrace, Exception e ErrorDetails. Ad esempio, se lo script viene modificato nel modo seguente:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
Il risultato sarà simile al seguente:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Liberare le risorse usando finally
Per liberare le risorse usate da uno script, aggiungere un finally
blocco dopo i try
blocchi e catch
. Le finally
istruzioni di blocco vengono eseguite indipendentemente dal fatto che il try
blocco riscontri un errore irreversibile. PowerShell esegue il blocco prima che finally
lo script termini o prima che il blocco corrente esegua l'ambito.
Un finally
blocco viene eseguito anche se si usa CTRL+C per arrestare lo script. Un finally
blocco viene eseguito anche se una parola chiave Exit arresta lo script dall'interno di un catch
blocco.