Condividi tramite


informazioni su Trap

Breve descrizione

Descrive una parola chiave che gestisce un errore di terminazione.

Descrizione lunga

Un errore di terminazione impedisce l'esecuzione di un comando. 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 parola chiave trap specifica un elenco di istruzioni da eseguire quando si verifica un errore di terminazione. Le istruzioni trap possono gestire gli errori di terminazione nei modi seguenti:

  • Visualizzare l'errore dopo aver elaborato il blocco di istruzioni trap e continuare l'esecuzione dello script o della funzione contenente il trap. Questo è il comportamento predefinito.

    Annotazioni

    Quando si verifica l'errore di terminazione in un blocco di script subordinato, ad esempio un'istruzione if o un ciclo foreach, le istruzioni nel blocco trap vengono eseguite ed l'esecuzione continua all'istruzione successiva all'esterno del blocco di script subordinato.

  • Visualizzare l'errore e interrompere l'esecuzione dello script o della funzione contenente il trap usando break nell'istruzione trap.

  • Disattivare l'errore, ma continuare l'esecuzione dello script o della funzione contenente il trap usando continue nell'istruzione trap.

L'elenco di istruzioni del 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 ha la sintassi seguente:

trap [[<error type>]] {<statement list>}

L'istruzione trap include un elenco di istruzioni da eseguire quando si verifica un errore irreversibile. Un'istruzione trap è costituita dalla parola chiave trap, 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 affina i tipi di errori che il trap cattura.

Uno script o un comando può avere più istruzioni trap. Le istruzioni trap possono comparire ovunque nello script o nel comando.

Rilevamento 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 di trap minima:

trap { 'Error found.' }

Questa istruzione trap gestisce 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:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

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:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Importante

trap le istruzioni possono essere definite ovunque all'interno di un blocco di script, ma si applicano sempre a tutte le istruzioni in quel blocco di script. In fase di esecuzione, le istruzioni trap in un blocco vengono definite prima di qualsiasi altra istruzione. In JavaScript, questa operazione è nota come sollevamento. Ciò significa che le istruzioni trap 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 trap alla fine di uno script e il lancio di un errore nella prima istruzione attivano ancora quel trap.

Rilevamento di errori specifici

Uno script o un comando può avere più istruzioni trap. È possibile definire un 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 istruzione trap visualizza la stringa Command error trapped. Dopo aver eseguito l'elenco di istruzioni trap, 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 di System.Exception. Questa istruzione intercetta eventuali errori generati da comandi sconosciuti. Blocca anche altri tipi di errori.

È 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 a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.

System.Management.Automation.CommandNotFoundException

È possibile avere più di un'istruzione trap in uno script. Solo un'istruzione trap può intercettare ogni tipo di errore. Quando si verifica un errore irreversibile, PowerShell cerca il trap con 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 trap generale che intercetta eventuali errori irreversibili e un'istruzione trap specifica 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:
Line |
   5 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

Poiché PowerShell non riconosce nonsenseString come cmdlet o altro elemento, restituisce un errore CommandNotFoundException. L'istruzione trap intrappola questo errore irreversibile.

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 produce il risultato seguente:

Other terminating error trapped
RuntimeException:
Line |
   5 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

Il tentativo di divisione per zero non crea un errore CommandNotFoundException. L'altra istruzione trap, che intercetta qualsiasi errore irreversibile, intercetta l'errore di divisione per zero.

Cattura degli errori 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 trap, il flusso di controllo torna al blocco di istruzioni successivo dopo il punto in cui si è verificato l'errore.

Ad esempio, quando si verifica un errore di terminazione in un'istruzione foreach, l'istruzione trap viene eseguita e l'esecuzione continua con l'istruzione successiva dopo il blocco foreach, non all'interno del blocco foreach.

trap { 'An error occurred!'}
foreach ($x in 3..0) {
   1/$x
   'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException:
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.
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 blocco di script foreach, esegue l'istruzione try e continua dopo il blocco di script foreach.

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 dal 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 all'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:
Line |
   3 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.
function1 was completed

L'istruzione trap nella funzione che intercetta l'errore. Dopo aver visualizzato il messaggio, PowerShell riprende l'esecuzione della funzione. Si noti che Function1 è completato dopo l'istruzione trap.

Confronta questo comportamento con l'esempio seguente, che presenta lo stesso errore e l'istruzione trap. 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 funzione Function2 produce il risultato seguente:

An error:
NonsenseString:
Line |
   2 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'NonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the
path is correct and try again.

In questo esempio il comando function2 was completed 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 definito lessicalmente (più in alto nel blocco di script).

Nell'esempio seguente viene eseguito solo il trap con whoops 1.

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }

Importante

Un'istruzione trap è limitata all'ambito in cui viene compilata. Se disponi di un'istruzione trap all'interno di una funzione o di uno script dot source, quando la funzione o lo script termina, tutte le istruzioni trap al suo interno vengono rimosse.

Uso delle parole chiave break e continue

È possibile usare le parole chiave break 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 elenco di istruzioni trap, PowerShell arresta la funzione o lo script. La funzione di esempio seguente usa la parola chiave break in un'istruzione trap:

function break_example {
    trap {
        'Error trapped'
        break
    }
    1/$null
    'Function completed.'
}

break_example
Error trapped
ParentContainsErrorRecordException:
Line |
   6 |      1/$null
     |      ~~~~~~~
     | Attempted to divide by zero.

Poiché l'istruzione trap includeva la parola chiave break, la funzione non continua a essere eseguita e la riga Function completed non viene eseguita.

Se si include una parola chiave continue in un'istruzione trap, PowerShell riprende dopo l'istruzione che ha causato l'errore, proprio come se fosse senza break o continue. Con la parola chiave continue, tuttavia, PowerShell non scrive un errore nel flusso di errori.

La funzione di esempio seguente usa la parola chiave continue in un'istruzione 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 è intrappolato e l'istruzione Function completed viene eseguita. Non viene scritto alcun errore nel flusso di errori.

Note

Le istruzioni trap forniscono un modo per garantire la gestione di tutti gli errori irreversibili in un blocco script. Per una gestione più dettagliata degli errori, usare i blocchi try/catch in cui vengono definite le trap usando istruzioni catch. Le istruzioni catch si applicano solo al codice all'interno dell'istruzione try associata. Per ulteriori informazioni, vedere about_Try_Catch_Finally.

Vedere anche