Informazioni su Trap
Breve descrizione
Descrive una parola chiave che gestisce un errore di terminazione.
Descrizione lunga
Un errore di terminazione interrompe l'esecuzione di un'istruzione. Se PowerShell non gestisce un errore di terminazione in qualche modo, PowerShell arresta anche l'esecuzione della funzione o dello script nella pipeline corrente. In altri linguaggi, ad esempio C#, gli errori di terminazione sono noti come eccezioni.
La Trap
parola chiave specifica un elenco di istruzioni da eseguire quando si verifica un errore di terminazione. Le istruzioni Trap gestiscono gli errori di terminazione e consentono l'esecuzione dello script o della funzione per continuare invece di arrestare.
Le istruzioni Trap possono anche essere più complesse. L'elenco delle istruzioni della trap può includere più condizioni o chiamate di funzione. Una trappola può scrivere log, condizioni di test o anche eseguire un altro programma.
Sintassi
L'istruzione Trap ha la sintassi seguente:
trap [[<error type>]] {<statement list>}
L'istruzione Trap include un elenco di istruzioni da eseguire quando si verifica un errore di terminazione. Un'istruzione Trap è costituita dalla trap
parola chiave, facoltativamente seguita da un'espressione di tipo e dal blocco di istruzioni contenente l'elenco di istruzioni da eseguire quando viene intrappolato un errore. L'espressione di tipo consente di perfezionare i tipi di errori di cattura della trappola.
Uno script o un comando possono avere più istruzioni Trap. Le istruzioni Trap possono essere visualizzate ovunque nello script o nel comando.
Cattura di tutti gli errori di terminazione
Quando si verifica un errore di terminazione non gestito in un altro modo in uno script o in un comando, PowerShell verifica la presenza di un'istruzione Trap che gestisce l'errore. Se è presente un'istruzione Trap, PowerShell continua a eseguire lo script o il comando nell'istruzione Trap.
L'esempio seguente è un'istruzione Trap molto semplice:
trap {"Error found."}
Questa istruzione Trap intrappola qualsiasi errore di terminazione.
Nell'esempio seguente la funzione include una stringa senza senso che causa un errore di runtime.
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
L'esecuzione di questa funzione restituisce quanto segue:
Error found.
L'esempio seguente include un'istruzione Trap che visualizza l'errore usando la $_
variabile automatica:
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
TrapTest
L'esecuzione di questa versione della funzione restituisce quanto segue:
Error found: 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 then try
again.
Importante
Le istruzioni Trap possono essere definite ovunque all'interno di un determinato ambito, ma si applicano sempre a tutte le istruzioni in tale ambito. In fase di esecuzione, le trap in un blocco vengono definite prima dell'esecuzione di altre istruzioni. In JavaScript, questo è noto come hoisting. Ciò significa che le trap si applicano a tutte le istruzioni in tale blocco anche se l'esecuzione non ha avanzato il punto in cui sono definiti. Ad esempio, la definizione di una trappola alla fine di uno script e la generazione di un errore nella prima istruzione attiva ancora tale trap.
Cattura di errori specifici
Uno script o un comando possono avere più istruzioni Trap. Le trap possono essere definite per gestire errori specifici.
L'esempio seguente è un'istruzione Trap che intrappola l'errore specifico CommandNotFoundException:
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
Quando una funzione o uno script rileva una stringa che non corrisponde a un comando noto, questa istruzione Trap visualizza la stringa "Errore di comando intrappolato". Dopo aver eseguito l'elenco Trap
delle istruzioni, PowerShell scrive l'oggetto errore nel flusso di errori e quindi continua lo script.
PowerShell usa i tipi di eccezioni di Microsoft .NET Framework. Nell'esempio seguente viene specificato il tipo di errore System.Exception :
trap [System.Exception] {"An error trapped"}
Il tipo di errore CommandNotFoundException eredita dal tipo System.Exception . Questa istruzione blocca un errore creato da un comando sconosciuto. Esegue anche la trappola di altri tipi di errore.
È possibile avere più di un'istruzione Trap in uno script. Ogni tipo di errore può essere intrappolato da un'unica istruzione Trap. Quando si verifica un errore di terminazione, PowerShell cerca la trap con la corrispondenza più specifica, a partire dall'ambito corrente dell'esecuzione.
L'esempio di script seguente contiene un errore. Lo script include un'istruzione Trap generale che intrappola eventuali errori di terminazione e un'istruzione specifica Trap
che specifica il tipo CommandNotFoundException .
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
"Command error trapped"
}
nonsenseString
L'esecuzione di questo script genera il risultato seguente:
Command error trapped
nonsenseString : 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.
At C:\temp\test\traptest.ps1:5 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Poiché PowerShell non riconosce "nonsenseString" come cmdlet o altro elemento, restituisce un errore CommandNotFoundException . Questo errore di terminazione viene intrappolato dall'istruzione Trap specifica.
L'esempio di script seguente contiene le stesse istruzioni Trap con un errore diverso:
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
L'esecuzione di questo script genera il risultato seguente:
Other terminating error trapped
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Il tentativo di dividere per zero non crea un errore CommandNotFoundException . L'errore viene invece intrappolato dall'altra istruzione Trap, che intrappola qualsiasi errore di terminazione.
Cattura di errori e ambito
Se si verifica un errore di terminazione nello stesso ambito dell'istruzione Trap, PowerShell esegue l'elenco di istruzioni definite dalla trap. L'esecuzione continua all'istruzione dopo l'errore. Se l'istruzione Trap si trova in un ambito diverso dall'errore, l'esecuzione continua all'istruzione successiva che si trova nello stesso ambito dell'istruzione Trap.
Ad esempio, se si verifica un errore in una funzione e l'istruzione Trap si trova nella funzione, lo script continua all'istruzione successiva. Lo script seguente contiene un errore e un'istruzione trap:
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
Più avanti nello script, l'esecuzione della funzione Function1 genera il risultato seguente:
function1
An error:
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
then try again.
At C:\PS>TestScript1.ps1:3 char:19
+ NonsenseString <<<<
function1 was completed
L'istruzione Trap nella funzione intrappola l'errore. Dopo aver visualizzato il messaggio, PowerShell riprende a eseguire la funzione. Si noti che Function1
è stato completato.
Confrontare questa operazione con l'esempio seguente, con lo stesso errore e Trap
istruzione. In questo esempio, l'istruzione trap si verifica all'esterno della funzione:
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
function2
L'esecuzione della Function2
funzione genera il risultato seguente:
An error:
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
then try again.
At C:\PS>TestScript2.ps1:4 char:19
+ NonsenseString <<<<
In questo esempio il comando "function2 è stato completato" non è stato eseguito. In entrambi gli esempi l'errore di terminazione si verifica all'interno della funzione. In questo esempio, tuttavia, l'istruzione Trap è esterna alla funzione. PowerShell non torna alla funzione dopo l'esecuzione dell'istruzione Trap.
Attenzione
Quando vengono definite più trap per la stessa condizione di errore, viene usata la prima trappola definita in modo lexicale (più alto nell'ambito).
Nell'esempio seguente viene eseguita solo la trap con "whoops 1".
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
Uso delle break
parole chiave e continue
È possibile usare le Break
parole chiave e Continue
in un'istruzione Trap per determinare se uno script o un comando continua a essere eseguito dopo un errore di terminazione.
Se si include un'istruzione in un Break
elenco di istruzioni Trap, PowerShell arresta la funzione o lo script. La funzione di esempio seguente usa la parola chiave in un'istruzione Break
Trap:
function break_example {
trap {
"Error trapped"
break
}
1/$null
"Function completed."
}
break_example
Error trapped
Attempted to divide by zero.
At line:4 char:7
Poiché l'istruzione Trap include la Break
parola chiave, la funzione non continua a essere eseguita e la riga "Funzione completata" non viene eseguita.
Se si include un'istruzione in un'istruzione Continue
Trap, PowerShell riprende dopo l'istruzione che ha causato l'errore, esattamente come senza Break
o Continue
. Con la Continue
parola chiave, tuttavia, PowerShell non scrive un errore nel flusso di errori.
La funzione di esempio seguente usa la parola chiave in un'istruzione Continue
Trap
:
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
La funzione riprende dopo che l'errore viene intrappolato e l'istruzione "Funzione completata" viene eseguita. Nessun errore viene scritto nel flusso di errori.
Note
Le istruzioni Trap offrono un modo semplice per garantire che tutti gli errori di terminazione all'interno di un ambito vengano gestiti. Per la gestione degli errori con granularità più fine, usare try
/catch
blocchi in cui vengono definite le trap usando Catch
le istruzioni. Le Catch
istruzioni si applicano solo al codice all'interno dell'istruzione associata Try
. Per altre informazioni, vedere about_Try_Catch_Finally.