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 o foreach un ciclo, le istruzioni nel blocco vengono eseguite e l'esecuzione trap 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 using break nell'istruzione trap .

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

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 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 traptrap è 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:
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 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 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. 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:
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 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
RuntimeException:
Line |
   5 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

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

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.

Vedi anche