about_Try_Catch_Finally

Descrizione breve

Viene descritto come usare i tryblocchi , catche finally per gestire gli errori di terminazione.

Descrizione lunga

Usare tryi blocchi , catche 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, catche finally sono simili alle tryparole chiave , catche 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.doce 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 trye 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.

Vedi anche