ARGOMENTO about_Trap DESCRIZIONE BREVE Descrive una parola chiave che gestisce un errore fatale. DESCRIZIONE DETTAGLIATA 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 nella pipeline corrente. Negli altri linguaggi, ad esempio C#, gli errori fatali vengono definiti eccezioni. La parola chiave Trap specifica un elenco di istruzioni da eseguire quando si verifica un errore fatale. Le istruzioni Trap gestiscono gli errori fatali e consentono di proseguire anziché arrestare l'esecuzione dello script o della funzione. Sintassi L'istruzione Trap ha la sintassi seguente: trap [[<tipo di errore>]] {<elenco istruzioni>} La l'istruzione Trap specifica un elenco di istruzioni da eseguire quando si verifica un errore fatale. La parola chiave Trap può specificare facoltativamente un tipo di errore. Un tipo di errore richiede l'uso di parentesi. Uno script o un comando può disporre di più istruzioni Trap. Le istruzioni Trap possono essere incluse in qualsiasi punto dello script o del comando. Intercettazione di tutti gli errori fatali Quando si verifica un errore fatale non gestito in un altro modo in uno script o comando, viene cercata un'istruzione Trap che gestisce l'errore. Se è presente un'istruzione Trap, viene proseguita l'esecuzione dello script o del comando nell'istruzione Trap. L'esempio seguente è un'istruzione Trap molto semplice: trap {"Rilevato errore."} Questa istruzione Trap intercetta qualsiasi errore fatale. L'esempio seguente è una funzione che contiene questa istruzione Trap: function TrapTest { trap {"Rilevato errore."} nonsenseString } Questa funzione include una stringa priva di significato che provoca un errore. L'esecuzione di questa funzione restituisce quanto segue: C:\PS> TrapTest Rilevato errore. L'esempio seguente include un'istruzione Trap che visualizza l'errore tramite la variabile automatica $_: function TrapTest { trap {"Rilevato errore: $_"} nonsenseString } L'esecuzione di questa versione della funzione restituisce quanto segue: C:\PS> TrapTest Rilevato errore: Termine 'nonsenseString' non riconosciuto come nome di cmdlet, funzione, programma eseguibile o file script. Controllare l'ortografia del nome o verificare che il percorso sia incluso e corretto, quindi riprovare. Le istruzioni Trap possono essere anche più complesse. Un'istruzione Trap può includere più condizioni o chiamate di funzione. Può registrare, verificare o anche eseguire un altro programma. Intercettazione degli errori fatali specificati L'esempio seguente è un'istruzione Trap che intercetta il tipo di errore CommandNotFoundException: trap [System.Management.Automation.CommandNotFoundException] {"Trap errore comando"} Quando una funzione o un script incontra una stringa che non corrisponde a un comando noto, questa istruzione Trap visualizza l'errore "Trap errore comando". Dopo l'esecuzione di qualsiasi istruzione nell'elenco dell'istruzione Trap, l'oggetto errore viene scritto nel flusso di errore, quindi viene proseguito lo script. In Windows PowerShell vengono utilizzati i tipi di eccezione di Microsoft .NET Framework. Nell'esempio seguente viene specificato il tipo di errore di System.Exception: trap [System.Exception] {"An error trapped"} Il tipo di errore CommandNotFoundException eredita dal tipo System.Exception. Questa istruzione intercetta un errore creato da un comando sconosciuto. Intercetta anche gli altri tipi di errore. In uno script possono essere presenti più istruzioni Trap. Ogni errore può essere intercettato da una sola istruzione Trap. Se si verifica un errore e sono disponibili più istruzioni Trap, viene utilizzata l'istruzione Trap con il tipo di errore più specifico che corrisponde all'errore. L'esempio di script seguente contiene un errore. Lo script include un'istruzione Trap generale che intercetta qualsiasi errore fatale e un'istruzione Trap specifica che specifica il tipo CommandNotFoundException. trap {"Trap altro errore fatale" } trap [System.Management.Automation.CommandNotFoundException] {"Trap errore comando"} nonsenseString L'esecuzione di questo script produce il risultato seguente: Trap errore comando Termine 'nonsenseString' non riconosciuto come nome di cmdlet, funzione, programma eseguibile o file script. Controllare l'ortografia del nome o verificare che il percorso sia incluso e corretto, quindi riprovare. At C:\PS>testScript1.ps1:3 char:19 + nonsenseString <<<< Poiché Windows PowerShell non riconosce "nonsenseString" come un cmdlet o altro elemento, restituisce un errore CommandNotFoundException. Questo errore fatale viene intercettato dall'istruzione Trap specifica. L'esempio dello script seguente contiene le stesse istruzioni Trap con un errore diverso: trap {"Trap altro errore fatale" } trap [System.Management.Automation.CommandNotFoundException] {"Trap errore comando"} 1/$null L'esecuzione di questo script produce il risultato seguente: Trap altro errore fatale Attempted to divide by zero. At C:PS> errorX.ps1:3 char:7 + 1/ <<<< $null Il tentativo di dividere per zero non crea un errore CommandNotFoundException. Al contrario, tale errore viene intercettato dall'altra istruzione Trap che intercetta qualsiasi errore fatale. Intercettazione di errori e ambito Se si verifica un errore fatale nello stesso ambito dell'istruzione Trap, dopo avere eseguito le istruzioni Trap, l'esecuzione continua dall'istruzione dopo l'errore. Se l'istruzione Trap è in un ambito diverso dall'errore, l'esecuzione continua dall'istruzione successiva nello stesso ambito dell'istruzione Trap. Ad esempio, se si verifica un errore in una funzione e l'istruzione Trap è nella funzione, lo script continua dall'istruzione successiva. Lo script seguente, ad esempio, contiene un errore e un'istruzione Trap: function function1 { trap { "Errore: " } NonsenseString "function1 completata" } Successivamente nello script, l'esecuzione di Function1 produce il risultato seguente: function1 Errore: Termine 'NonsenseString' non riconosciuto come nome di cmdlet, funzione, programma eseguibile o file script. Controllare l'ortografia del nome o verificare che il percorso sia incluso e corretto, quindi riprovare. At C:\PS>TestScript1.ps1:3 char:19 + NonsenseString <<<< function1 completata L'istruzione Trap nella funzione intercetta l'errore. Dopo avere visualizzato il messaggio, viene ripresa l'esecuzione della funzione. Notare che Function1 non viene completata. Confrontare questo con l'esempio seguente che presenta lo stesso errore e l'istruzione Trap. In questo esempio, l'istruzione Trap viene eseguita fuori della funzione: function function2 { NonsenseString "function2 completata" } trap { "Errore: " } . . . function2 Successivamente nello script, l'esecuzione di Function2 produce il risultato seguente: Errore: Termine 'NonsenseString' non riconosciuto come nome di cmdlet, funzione, programma eseguibile o file script. Controllare l'ortografia del nome o verificare che il percorso sia incluso e corretto, quindi riprovare. At C:\PS>TestScript2.ps1:4 char:19 + NonsenseString <<<< In questo esempio, il comando "function2 completata" non è stato eseguito. Anche se entrambi gli errori fatali si verificano in una funzione, se l'istruzione Trap è esterna alla funzione, Windows PowerShell non torna nelle funzione dopo l'esecuzione dell'istruzione Trap. Utilizzo delle parole chiave Break e Continue È possibile utilizzare le parole chiave Break e Continue in un'istruzione Trap per determinare se l'esecuzione di uno script o un comando prosegue dopo un errore fatale. Se si include un'istruzione Break nell'elenco di istruzioni Trap, viene interrotta la funzione o lo script. La funzione di esempio seguente utilizza la parola chiave Break in un'istruzione Trap: C:\PS> function break_example { trap {"Trap errore"; break;} 1/$null "Funzione completata." } C:\PS> break_example Trap errore Attempted to divide by zero. At line:4 char:7 Poiché l'istruzione Trap include la parola chiave Break, l'esecuzione della funzione non prosegue e la riga "Funzione completata" non viene eseguita. Se si include un'istruzione Continue in un'istruzione Trap, l'esecuzione viene ripresa dopo l'istruzione che ha provocato l'errore, come in assenza della parola chiave Break o Continue. Con la parola chiave Continue, tuttavia, non viene scrive un errore nel flusso di errore. La funzione di esempio seguente utilizza la parola chiave Continue in un'istruzione Trap: C:\PS> function continue_example { trap {"Trap errore"; continue;} 1/$null "Funzione completata."} C:\PS> continue_example Trap errore Funzione completata. La funzione riprende dopo che viene intercettato l'errore e l'istruzione "Funzione completata" viene eseguita. Non viene scritto alcun errore nel flusso di errore. VEDERE ANCHE about_Break about_Continue about_Throw about_Try_Catch_Finally about_Scopes