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