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. Si tratta del 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'affermazione molto semplice trap :

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 quanto segue:

Error found.
nonsenseString:
Line |
   3 |      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.

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 try again.
nonsenseString:
Line |
   3 |      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.

Importante

trap Le istruzioni 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 istruzioni trap in un blocco vengono definite prima di qualsiasi altra istruzione. In JavaScript, questa operazione è nota come sollevamento. Ciò significa che trap le istruzioni si applicano a tutte le istruzioni in quel blocco anche se l'esecuzione non è avanzata 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 trap istruzione visualizza la stringa "Errore di comando intercettato". 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 un errore creato da un comando sconosciuto. Blocca anche altri tipi di errori.

È possibile avere più di un'istruzione trap in uno script. Ogni tipo di errore può essere intercettato da una trap sola istruzione. Quando si verifica un errore irreversibile, PowerShell cerca la trap corrispondenza più specifica, a partire dall'ambito di esecuzione corrente.

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 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.

Poiché PowerShell non riconosce "nonsenseString" come cmdlet o altro elemento, restituisce un errore CommandNotFoundException . Questo errore irreversibile è intercettato dall'istruzione specifica trap .

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 |
   4 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

Il tentativo di dividere per zero non crea un errore CommandNotFoundException . Al contrario, l'errore viene intercettato dall'altra trap istruzione, che intrappola qualsiasi errore irreversibile.

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: untitled:Untitled-1:3:4
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.

after loop

Nell'output precedente, puoi vedere che i cicli continuano fino all'ultima iterazione. Quando lo script tenta di dividere 1 per 0, viene generato un errore irreversibile. Il resto dello foreach scriptblock viene ignorato, l'istruzione try viene eseguita e lo script continua dopo lo foreach scriptblock.

Intercettazione di errori e ambito

Se si verifica un errore irreversibile nello stesso ambito 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 ambito diverso da quello dell'errore, l'esecuzione continua in corrispondenza dell'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"
}

function1

L'esecuzione di questo script produce il risultato seguente:

An error:
NonsenseString:
Line |
   3 |      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.
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 è stato completato.

Confrontare questo con l'esempio seguente, che contiene lo stesso errore e trap la stessa 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 funzione Function2 produce il risultato seguente:

An error:
NonsenseString:
Line |
   2 |      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.

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 utilizzata la prima trap definita lessicalmente (la più alta nell'ambito).

Nell'esempio seguente, viene eseguito solo il trap with "whoops 1".

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

Importante

L'ambito di un'istruzione Trap è la posizione 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 break parola chiave, la funzione non continua a essere eseguita e la riga "Funzione completata" 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 continue parola chiave, 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 l'intercettazione dell'errore e viene eseguita l'istruzione "Function completed". Non viene scritto alcun errore nel flusso di errori.

Note

trap Le istruzioni forniscono un modo semplice per garantire in modo ampio che vengano gestiti tutti gli errori di terminazione all'interno di un ambito. 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