about_Try_Catch_Finally

Aggiornamento: maggio 2014

Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

ARGOMENTO

about_Try_Catch_Finally

DESCRIZIONE BREVE

Questo articolo descrive come usare i blocchi Try, Catch e Finally per gestire gli errori fatali.

DESCRIZIONE LUNGA

Usare i blocchi Try, Catch e Finally per rispondere agli errori fatali negli script oppure per gestirli. L'istruzione Trap può essere usata anche per gestire gli errori fatali degli script. Per altre informazioni, vedere about_Trap.

Un errore fatale arresta l'esecuzione di un'istruzione. Se Windows PowerShell® non gestisce un errore fatale in qualche modo, anche Windows PowerShell arresta l'esecuzione della funzione o dello script usando la pipeline corrente. In altri linguaggi, ad esempio C#, gli errori fatali vengono definiti eccezioni. Per altre informazioni sugli errori, vedere about_Errors.

Usare il blocco Try per definire la sezione di uno script nella quale Windows PowerShell deve verificare la presenza di errori. Quando si verifica un errore nel blocco Try, tale errore viene innanzitutto salvato nella variabile automatica $Error. In seguito, Windows PowerShell cerca un blocco Catch per gestire l'errore. Se nell'istruzione Try non è presente un blocco Catch corrispondente, Windows PowerShell continua a cercare un blocco Catch appropriato o l'istruzione Trap negli ambiti padre. Al termine dell'esecuzione del blocco Catch oppure se non viene trovato alcun blocco Catch appropriato o istruzione Trap, viene eseguito il blocco Finally. Se non è possibile gestire l'errore, quest'ultimo viene scritto nel flusso di errore.

Un blocco Catch può includere comandi per rilevare l'errore o per ripristinare il flusso previsto dello script. Un blocco Catch può specificare la tipologia di errori che acquisisce. Un'istruzione Try può includere più blocchi Catch per diversi tipi di errori.

Un blocco Finally può essere usato per liberare le risorse che non sono più necessarie allo script.

I blocchi Try, Catch e Finally sono simili alle parole chiave Try, Catch e Finally usate nel linguaggio di programmazione C#.

SINTASSI

Un'istruzione Try contiene un blocco Try, nessuno o alcuni blocchi Catch e nessuno o un slolo blocco Finally. Un'istruzione Try deve disporre almeno di un blocco Catch o di un blocco Finally.

Di seguito viene illustrata la sintassi del blocco Try:

          try {<statement list>}

La parola chiave Try è seguita da un elenco di istruzioni racchiuse tra parentesi graffe. Se si verifica un errore fatale durante l'esecuzione di istruzioni incluse nell'elenco, lo script trasferisce l'oggetto di errore dal blocco Try a un blocco Catch adeguato.

Di seguito viene illustrata la sintassi del blocco Catch:

          catch [[<error type>][',' <error type>]*] {<statement list>}

I tipi di errori vengono visualizzati tra parentesi. Le parentesi più esterne indicano che l'elemento è facoltativo.

La parola chiave Catch è seguita da un elenco facoltativo di specifiche relative al tipo di errore e da un elenco di istruzioni. Se si verifica un errore fatale nel blocco Try, Windows PowerShell cerca un blocco Catch appropriato. Se la ricerca restituisce un risultato, vengono eseguite le istruzioni nel blocco Catch.

Nel blocco Catch è possibile specificare uno o più tipi di errore. Un tipo di errore consiste in un'eccezione di Microsoft .NET Framework oppure in un'eccezione che deriva da un'eccezione di .NET Framework. Un blocco Catch gestisce gli errori della classe di eccezione .NET Framework specificata oppure di tutte le classi derivate da quella specificata.

Se un blocco Catch specifica un tipo di errore, gestisce tale tipo di errore. Se un blocco Catch non specifica un tipo di errore, gestisce gli errori rilevati nel blocco Try. Un'istruzione Try può includere più blocchi Catch per i diversi tipi di errore specificati.

Di seguito viene illustrata la sintassi del blocco Finally:

          finally {<statement list>}

La parola chiave Finally è seguita da un elenco di istruzioni che viene eseguito ad ogni esecuzione dello script, anche se l'istruzione Try è stata eseguita senza errori oppure è stato rilevato un errore nell'istruzione Catch.

Si noti che se si preme CTRL + C la pipeline viene interrotta. Gli oggetti che vengono inviati alla pipeline non verranno visualizzati come output. Pertanto, se si include un'istruzione da visualizzare, ad esempio "Il blocco Finally è stato eseguito", tale istruzione non viene visualizzata dopo aver premuto CTRL+C, anche se il blocco Finally è stato eseguito.

RILEVAMENTO DI ERRORI

Lo script di esempio seguente mostra un blocco Try con un blocco Catch:

          try { NonsenseString }
          catch { "An error occurred." }

La parola chiave Catch deve essere immediatamente successiva a un blocco Try o a un altro blocco Catch.

Windows PowerShell non riconosce "NonsenseString" come cmdlet o altro elemento. L'esecuzione dello script restituisce il risultato seguente:

          An error occurred.

Quando lo script rileva "NonsenseString", si verifica un errore fatale. Il blocco Catch gestisce l'errore eseguendo l'elenco di istruzioni all'interno del blocco.

USO DI PIÙ ISTRUZIONI CATCH

Un'istruzione Try può disporre di qualsiasi numero di blocchi Catch. Ad esempio, lo script seguente dispone di un blocco Try che scarica il file MyFile.doc e comprende 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]
          {
              "Unable to download MyDoc.doc from https://www.contoso.com."
          }
          catch
          {
              "An error occurred that could not be resolved."
          }

Il primo blocco Catch gestisce errori delle tipologie System.Net.WebException e System.IO.IOException. Il secondo blocco Catch non specifica un tipo di errore. Il secondo blocco Catch gestisce tutti gli altri errori fatali.

Windows PowerShell crea associazioni di tipi di errore in base all'ereditarietà. Un blocco Catch gestisce gli errori della classe di eccezione .NET Framework specificata oppure di tutte le classi derivate da quella specificata. Nell'esempio seguente è presente un blocco Catch che rileva un errore "Comando non trovato":

          catch [System.Management.Automation.CommandNotFoundException] 
              {"Inherited Exception" }

CommandNotFoundException, il tipo di errore specificato, eredita dal tipo System.SystemException. Nell'esempio seguente viene rilevato anche un errore "Comando non trovato":

          catch [System.SystemException] {"Base Exception" }

Questo blocco Catch gestisce l'errore "Comando non trovato" e altri errori che vengono ereditati dal tipo SystemException.

Se si specificano una classe di errore e una delle relative classi derivate, inserire il blocco Catch per la classe derivata prima del blocco Catch per la classe generale.

LIBERARE LE RISORSE TRAMITE IL BLOCCO FINALLY

Per liberare le risorse usate da uno script, aggiungere un blocco Finally dopo i blocchi Try e Catch. Le istruzioni del blocco Finally vengono eseguite a prescindere dal rilevamento di un errore fatale da parte del blocco Try. Windows PowerShell esegue il blocco Finally prima del completamento dello script o prima che il blocco corrente non sia più presente nell'ambito.

Un blocco Finally viene eseguito anche se si usa CTRL+C per interrompere lo script. Un blocco Finally viene eseguito anche se la parola chiave Exit interrompe lo script dall'interno del blocco Catch.

VEDERE ANCHE

about_Break

about_Continue

about_Scopes

about_Throw

about_Trap