about_Trap

Kort beskrivning

Beskriver ett nyckelord som hanterar ett avslutande fel.

Lång beskrivning

Ett avslutande fel hindrar en instruktion från att köras. Om PowerShell inte hanterar ett avslutande fel på något sätt slutar PowerShell också att köra funktionen eller skriptet i den aktuella pipelinen. På andra språk, till exempel C#, kallas avslutande fel undantag.

Nyckelordet trap anger en lista över instruktioner som ska köras när ett avslutande fel inträffar. trap -instruktioner kan hantera avslutande fel på följande sätt:

  • Visa felet när instruktionsblocket trap har bearbetats och körningen av skriptet eller funktionen som innehåller trap. Det här beteendet är standard.

    Anteckning

    När det avslutande felet inträffar i ett underordnat skriptblock, till exempel en if instruktion eller foreach loop, körs -uttrycken trap i blocket och körningen fortsätter vid nästa -instruktion utanför det underordnade skriptblocket.

  • Visa felet och avbryt körningen av skriptet eller funktionen som innehåller trap användning break i -instruktionen trap .

  • Tysta felet, men fortsätt körningen av skriptet eller funktionen som innehåller trap med hjälp continue av i -instruktionen trap .

Instruktionslistan trap för kan innehålla flera villkor eller funktionsanrop. A trap kan skriva loggar, testa villkor eller till och med köra ett annat program.

Syntax

Instruktionen trap har följande syntax:

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

Instruktionen trap innehåller en lista över instruktioner som ska köras när ett avslutande fel inträffar. En trap -instruktion består av nyckelordet trap , eventuellt följt av ett typuttryck, och instruktionsblocket som innehåller listan över instruktioner som ska köras när ett fel har fastnat. Typuttrycket förfinar de typer av fel som trap fångas.

Ett skript eller kommando kan ha flera trap instruktioner. trap -instruktioner kan visas var som helst i skriptet eller kommandot.

Fånga alla avslutande fel

När ett avslutande fel inträffar som inte hanteras på något annat sätt i ett skript eller kommando söker PowerShell efter en trap instruktion som hanterar felet. Om det finns en trap instruktion fortsätter PowerShell att köra skriptet eller kommandot i -instruktionen trap .

Följande exempel är en minimal trap instruktion:

trap { 'Error found.' }

Den här trap instruktionen genererar eventuella avslutande fel.

I följande exempel innehåller funktionen en nonsenssträng som orsakar ett körningsfel.

function TrapTest {
    trap { 'Error found.' }
    nonsenseString
}

TrapTest

Om du kör den här funktionen returneras följande utdata:

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.

Följande exempel innehåller en trap instruktion som visar felet med hjälp av den $_ automatiska variabeln:

function TrapTest {
    trap { "Error found: $_" }
    nonsenseString
}

TrapTest

Om du kör den här versionen av funktionen returneras följande utdata:

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.

Viktigt

trap -instruktioner kan definieras var som helst inom ett visst skriptblock, men gäller alltid för alla instruktioner i skriptblocket. Vid körning trap definieras instruktioner i ett block innan andra instruktioner körs. I JavaScript kallas detta hissning. Det innebär att trap instruktioner gäller för alla instruktioner i det blocket även om körningen inte har avancerat förbi den punkt där de definieras. Om du till exempel definierar ett trap i slutet av ett skript och genererar ett fel i den första instruktionen utlöses fortfarande den trap.

Fånga specifika fel

Ett skript eller kommando kan ha flera trap instruktioner. A trap kan definieras för att hantera specifika fel.

Följande exempel är en trap instruktion som hämtar det specifika felet CommandNotFoundException:

trap [System.Management.Automation.CommandNotFoundException] {
    'Command error trapped'
}

När en funktion eller ett skript påträffar en sträng som inte matchar ett känt kommando, visar den här trap instruktionen strängen Command error trapped . När du har kört instruktionslistan trap skriver PowerShell felobjektet till felströmmen och fortsätter sedan skriptet.

PowerShell använder .NET-undantagstyper. I följande exempel anges feltypen System.Exception :

trap [System.Exception] { 'An error trapped' }

Feltypen CommandNotFoundException ärver från typen System.Exception. Den här instruktionen hämtar eventuella fel som genereras av okända kommandon. Den hämtar även andra feltyper.

Du hittar undantagstypen för ett fel genom att granska felobjektet. I följande exempel visas hur du hämtar det fullständiga namnet på undantaget för det senaste felet i en session:

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

Du kan ha mer än en trap instruktion i ett skript. Endast en trap instruktion kan svälla varje feltyp. När ett avslutande fel inträffar söker PowerShell efter den trap mest specifika matchningen, med början i det aktuella skriptblocket för körning.

Följande skriptexempel innehåller ett fel. Skriptet innehåller en allmän trap instruktion som hämtar eventuella avslutande fel och en specifik trap instruktion som anger typen CommandNotFoundException .

trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
  'Command error trapped'
}
nonsenseString

När du kör det här skriptet får du följande resultat:

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.

Eftersom PowerShell inte känner igen nonsenseString som en cmdlet eller något annat objekt returneras ett CommandNotFoundException-fel . Den specifika trap instruktionen genererar det här avslutande felet.

Följande skriptexempel innehåller samma trap instruktioner med ett annat fel:

trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
    'Command error trapped'
}
1/$null

När du kör det här skriptet får du följande resultat:

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

Försöket att dividera med noll skapar inte ett CommandNotFoundException-fel . Den andra trap instruktionen, som genererar ett avslutande fel, sväller uppdelningen med noll fel.

Fånga fel i ett skriptblock

När ett avslutande fel utlöses överförs körningen som standard till trap-instruktionen. trap När blocket har körts återgår kontrollen till nästa instruktionsblock efter felplatsen.

När ett avslutande fel till exempel inträffar i en foreach -instruktion körs -instruktionen trap och körningen fortsätter vid nästa instruktion efter foreach blocket, inte inom foreach blocket.

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

I utdata kan du se att looparna fortsätter till den senaste iterationen. När skriptet försöker dela upp 1 med 0 genererar PowerShell ett avslutande fel. Skriptet hoppar över resten av skriptblocket foreach , kör -instruktionen try och fortsätter efter skriptblocket foreach .

Fånga fel och omfång

Om ett avslutande fel inträffar i samma skriptblock som -instruktionen trap kör PowerShell listan över -instruktioner som definieras av trap. Körningen fortsätter vid -instruktionen efter felet. Om -instruktionen trap finns i ett annat skriptblock än felet fortsätter körningen vid nästa -instruktion som finns i samma skriptblock som -instruktionen trap .

Om till exempel ett fel inträffar i en funktion och -instruktionen trap finns i funktionen fortsätter skriptet vid nästa instruktion. Följande skript innehåller ett fel och en trap instruktion:

function function1 {
    trap { 'An error: ' }
    NonsenseString
    'function1 was completed'
}

function1

När du kör det här skriptet får du följande resultat:

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

- trap instruktionen i funktionen hämtar felet. När du har visat meddelandet fortsätter PowerShell att köra funktionen. Observera att har Function1 slutförts efter -instruktionen trap .

Jämför det här beteendet med följande exempel, som har samma fel och trap instruktion. I det här exemplet sker -instruktionen trap utanför funktionen:

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

När du Function2 kör funktionen får du följande resultat:

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.

I det här exemplet function2 was completed kördes inte kommandot. I båda exemplen inträffar det avslutande felet i funktionen. I det här exemplet ligger instruktionen trap dock utanför funktionen. PowerShell går inte tillbaka till funktionen efter att instruktionen har körts trap .

Varning

När flera traps definieras för samma felvillkor används det första trap lexikaliskt (högst i skriptblocket).

I följande exempel är det bara trap med whoops 1 körningar.

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

Viktigt

En trap instruktion är begränsad till den där den kompileras. Om du har en trap instruktion i ett funktions- eller punktkällskript tas alla trap instruktioner inuti bort när funktionen eller punktskriptet avslutas.

Använda nyckelorden break och continue

Du kan använda nyckelorden break och continue i en trap -instruktion för att avgöra om ett skript eller kommando fortsätter att köras efter ett avslutande fel.

Om du inkluderar en break instruktion i en trap instruktionslista stoppar PowerShell funktionen eller skriptet. Följande exempelfunktion använder nyckelordet break i en trap -instruktion:

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.

Eftersom -instruktionen trap inkluderade nyckelordet break fortsätter inte funktionen att köras och Function completed raden körs inte.

Om du inkluderar ett continue nyckelord i en trap -instruktion återupptas PowerShell efter -instruktionen som orsakade felet, precis som utan break eller continue. Med nyckelordet continue skriver PowerShell dock inte ett fel till felströmmen.

Följande exempelfunktion använder nyckelordet continue i en trap -instruktion:

function continue_example {
    trap {
        'Error trapped'
        continue
    }
    1/$null
    'Function completed.'
}

continue_example
Error trapped
Function completed.

Funktionen återupptas när felet har fastnat och -instruktionen Function completed körs. Inget fel skrivs till felströmmen.

Kommentarer

trap -instruktioner är ett sätt att se till att alla avslutande fel i ett skriptblock hanteras. För mer detaljerad felhantering använder du try/catch block där traps definieras med hjälp av catch instruktioner. - catch instruktionerna gäller endast för koden i den associerade try -instruktionen. Mer information finns i about_Try_Catch_Finally.

Se även