about_Trap
Descrizione breve
Descrive una parola chiave che gestisce un errore di terminazione.
Descrizione lunga
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 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. trap
Le istruzioni possono gestire gli errori di terminazione nei modi seguenti:
Visualizzare l'errore dopo l'elaborazione del
trap
blocco di istruzioni e la continua esecuzione dello script o della funzione contenente .trap
Questo è il comportamento predefinito.Nota
Quando l'errore di terminazione si verifica in un blocco di script subordinato, ad esempio un'istruzione
if
oforeach
un ciclo, le istruzioni nel blocco vengono eseguite e l'esecuzionetrap
continua all'istruzione successiva all'esterno del blocco di script subordinato.Visualizzare l'errore e interrompere l'esecuzione dello script o della funzione contenente l'oggetto
trap
usingbreak
nell'istruzionetrap
.Disattivare l'errore, ma continuare l'esecuzione dello script o della funzione contenente
trap
usandocontinue
nell'istruzionetrap
.
L'elenco di istruzioni di trap
può includere più condizioni o chiamate di funzione. Un trap
può scrivere log, condizioni di test o persino eseguire un altro programma.
Sintassi
L'istruzione trap
presenta la sintassi seguenti:
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
trap
è costituita dalla parola chiave , seguita facoltativamente da un'espressione di tipo e dal blocco di istruzioni contenente l'elenco di istruzioni da eseguire quando viene intercerato un errore. L'espressione di tipo consente di perfezionare i tipi di errori intercetti trap
.
Uno script o un comando può avere più trap
istruzioni. trap
Le istruzioni possono essere visualizzate ovunque nello script o nel comando.
Intercettazione di tutti gli errori di terminazione
Quando si verifica un errore irreversibile che non viene 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 minima trap
:
trap { 'Error found.' }
Questa trap
istruzione intercettare eventuali errori irreversibili.
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 l'output seguente:
Error found.
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 line:3 char:5
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
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 l'output seguente:
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
try again.
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 line:3 char:5
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Importante
trap
Le istruzioni possono essere definite in qualsiasi punto all'interno di un determinato blocco di script, ma si applicano sempre a tutte le istruzioni in tale blocco di script. In fase di esecuzione, trap
le istruzioni in un blocco vengono definite prima dell'esecuzione di altre istruzioni.
In JavaScript, questa operazione è nota come oriatura. Ciò significa che trap
le istruzioni si applicano a tutte le istruzioni in tale blocco anche se l'esecuzione non ha avanzato oltre il punto in cui sono definite. Ad esempio, la definizione di un oggetto trap
alla fine di uno script e la creazione di un errore nella prima istruzione attiva ancora .trap
Intercettazione di errori specifici
Uno script o un comando può avere più trap
istruzioni. È possibile definire un oggetto trap
per gestire errori specifici.
L'esempio seguente è un'istruzione trap
che intercetta 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 trap
istruzione visualizza la Command error trapped
stringa.
Dopo aver eseguito l'elenco trap
di istruzioni, PowerShell scrive l'oggetto errore nel flusso di errori e quindi continua lo script.
PowerShell usa tipi di eccezione .NET. 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 intercettare eventuali errori generati da comandi sconosciuti. Inoltre, intercettare altri tipi di errore.
È possibile trovare il tipo di eccezione per un errore esaminando l'oggetto errore. Nell'esempio seguente viene illustrato come ottenere il nome completo dell'eccezione per l'ultimo errore in una sessione:
nonsenseString
$Error[0].Exception.GetType().FullName
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 line:1 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
System.Management.Automation.CommandNotFoundException
È possibile avere più di un'istruzione trap
in uno script. Una trap
sola istruzione può intercettare ogni tipo di errore. Quando si verifica un errore irreversibile, PowerShell cerca con trap
la corrispondenza più specifica, a partire dal blocco di script corrente di esecuzione.
L'esempio di script seguente contiene un errore. Lo script include un'istruzione generale trap
che intercetta qualsiasi errore 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 produce 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 line:5 char:1
+ nonsenseString}
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Poiché PowerShell non riconosce "nonsenseString" come cmdlet o un altro elemento, restituisce un errore CommandNotFoundException . L'istruzione specifica trap
intercettare questo errore di terminazione.
L'esempio di script seguente contiene le stesse trap
istruzioni con un errore diverso:
trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
1/$null
L'esecuzione di questo script produce il risultato seguente:
Other terminating error trapped
Attempted to divide by zero.
At line:5 char:1
+ 1/$null}
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Il tentativo di dividere per zero non crea un errore CommandNotFoundException . L'altra trap
istruzione, che intercettare qualsiasi errore irreversibile, intercettare la divisione per zero errore.
Errori di intercettazione in un blocco di script
Per impostazione predefinita, quando viene generato un errore di terminazione, l'esecuzione viene trasferita all'istruzione trap. Dopo l'esecuzione del blocco, il trap
controllo torna al blocco di istruzioni successivo dopo il percorso dell'errore.
Ad esempio, quando si verifica un errore di terminazione in un'istruzione foreach
, l'istruzione trap
viene eseguita ed l'esecuzione continua con l'istruzione successiva dopo il foreach
blocco, non all'interno del foreach
blocco.
trap { 'An error occurred!'}
foreach ($x in 3..-1) {
"1/$x = "
"`t$(1/$x)"
}
'after loop'
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
An error occurred!
Attempted to divide by zero.
At line:3 char:4
+ 1/$x
+ ~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
after loop
Nell'output è possibile visualizzare i cicli che continuano fino all'ultima iterazione. Quando lo script tenta di dividere 1 per 0, PowerShell genera un errore irreversibile. Lo script ignora il resto del foreach
blocco di script, esegue l'istruzione try
e continua dopo il foreach
blocco di script.
Intercettazione di errori e ambito
Se si verifica un errore irreversibile nello stesso blocco di script dell'istruzione trap
, PowerShell esegue l'elenco di istruzioni definite da trap
. L'esecuzione continua con l'istruzione dopo l'errore. Se l'istruzione trap
si trova in un blocco di script diverso dall'errore, l'esecuzione continua con l'istruzione successiva nello stesso blocco di script dell'istruzione trap
.
Ad esempio, se si verifica un errore in una funzione e l'istruzione trap
si trova nella funzione , lo script continua con l'istruzione successiva. Lo script seguente contiene un errore e un'istruzione trap
:
function function1 {
trap { 'An error: ' }
NonsenseString
'function1 was completed'
}
function1
L'esecuzione di questo script produce il risultato seguente:
An error:
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 line:3 char:5
+ NonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (NonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
function1 was completed
L'istruzione trap
nella funzione intercettare l'errore. Dopo aver visualizzato il messaggio, PowerShell riprende l'esecuzione della funzione. Si noti che Function1
è stato completato dopo l'istruzione trap
.
Confrontare questo comportamento con l'esempio seguente, con la stessa istruzione e trap
errore. In questo esempio l'istruzione si verifica all'esterno trap
della funzione :
function function2 {
NonsenseString
'function2 was completed'
}
trap { 'An error:' }
function2
L'esecuzione della Function2
funzione produce il risultato seguente:
An error:
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 line:2 char:5
+ NonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (NonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
In questo esempio il function2 was completed
comando 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 usato il primo trap
linguaggio definito lessicalmente (più alto nel blocco di script).
Nell'esempio seguente viene eseguito solo con trap
whoops 1
.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Importante
Un'istruzione trap
ha come ambito la posizione in cui viene compilata. Se si dispone di un'istruzione trap
all'interno di una funzione o di uno script con origine punto, quando la funzione o lo script con origine punto termina, tutte le trap
istruzioni all'interno vengono rimosse.
Uso delle parole chiave break 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 break
in un trap
elenco di istruzioni, PowerShell arresta la funzione o lo script. La funzione di esempio seguente usa la break
parola chiave in un'istruzione trap
:
function break_example {
trap {
'Error trapped'
break
}
1/$null
'Function completed.'
}
break_example
Error trapped
Attempted to divide by zero.
At line:6 char:5
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorR
ecordException
+ FullyQualifiedErrorId : RuntimeException
Poiché l'istruzione trap
includeva la break
parola chiave , la funzione non continua a essere eseguita e la Function completed
riga non viene eseguita.
Se si include una continue
parola chiave in un'istruzione trap
, PowerShell riprende dopo l'istruzione che ha causato l'errore, esattamente come se fosse 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 continue
parola chiave in un'istruzione trap
:
function ContinueExample {
trap {
'Error trapped'
continue
}
foreach ($x in 3..-1) {
"1/$x = "
"`t$(1/$x)"
}
'End of function'
}
ContinueExample
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
Error trapped
End of function
La funzione riprende dopo che l'errore è intrappolato e l'istruzione End of function
viene eseguita. Non viene scritto alcun errore nel flusso di errori.
Note
trap
Le istruzioni consentono di garantire che tutti gli errori di terminazione all'interno di un blocco di script vengano gestiti. Per una gestione degli errori più granulare, usare try
/catch
blocchi in cui vengono definiti trap tramite istruzioni.catch
Le catch
istruzioni si applicano solo al codice all'interno dell'istruzione associata try
. Per altre informazioni, vedere about_Try_Catch_Finally.