about_Trap

Kort beskrivning

Beskriver ett nyckelord som hanterar ett avslutande fel.

Lång beskrivning

Ett stoppfel hindrar ett kommando 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 för 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 efter bearbetning av trap-instruktionsblocket och fortsatt körning av skriptet eller funktionen som innehåller trap. Det här är standardbeteendet.

    Anmärkning

    När det avslutande felet inträffar i ett underordnat skriptblock, till exempel en if-instruktion eller en foreach-loop, körs instruktionerna i trap-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 med hjälp av break i trap-instruktionen.

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

Instruktionslistan över trap kan innehålla flera villkor eller funktionsanrop. En 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>}

trap-instruktionen 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 fångas. Typuttrycket förfinar de typer av fel som trap fångar upp.

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

Följande exempel är ett mycket enkelt trap uttalande:

trap {"Error found."}

Den här trap-instruktionen fångar eventuella avslutande fel.

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

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

TrapTest

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

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.

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:

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.

Viktigt!

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

Fånga specifika fel

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

Följande exempel är en trap-instruktion som fångar 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 "Kommandofel fångad". När trap-instruktionslistan har körts, skriver PowerShell felobjektet till felströmmen och fortsätter sedan med 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 fångar ett fel som skapas av ett okänt kommando. Den fångar också andra feltyper.

Du kan ha mer än en trap-instruktion i ett skript. Varje feltyp kan bara fångas upp av en trap instruktion. När ett avslutande fel inträffar söker PowerShell efter med trap den mest specifika matchningen, med början i det aktuella körningsomfånget.

Följande skriptexempel innehåller ett fel. Skriptet innehåller en allmän trap-instruktion som fångar upp alla avslutande fel och en specifik trap-instruktion som anger CommandNotFoundException Typ.

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

Eftersom PowerShell inte känner igen "nonsenseString" som en cmdlet eller ett annat objekt returnerar det ett CommandNotFoundException fel. Det här avslutande felet fångas upp av den specifika trap instruktionen.

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

Försöket att dividera med noll skapar inte ett CommandNotFoundException fel. I stället fångas felet av den andra trap instruktionen, vilket fångar upp eventuella avslutande fel.

Fånga fel i ett skriptblock

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

När ett avslutande fel till exempel inträffar i en foreach-instruktion körs trap-instruktionen 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: untitled:Untitled-1:3:4
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.

after loop

I utdata ovan kan du se att looparna fortsätter tills den sista iterationen. När skriptet försöker dividera 1 med 0 genereras ett avslutande fel. Resten av scriptblocket foreach hoppas över, -instruktionen try körs och skriptet fortsätter efter scriptblocket foreach .

Fånga fel och räckvidd

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

Om till exempel ett fel inträffar i en funktion och trap-instruktionen 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 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

trap-instruktionen i funktionen fångar upp felet. När meddelandet har visats återupptar PowerShell körningen av funktionen. Observera att det Function1 var klart.

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

function function2 {
    NonsenseString
    "function2 was completed"
}

trap { "An error: " }

function2

Om du kör funktionen Function2 får du följande resultat:

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.

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

Försiktighet

När flera traps definieras för samma feltillstånd används det första trap definierade lexikaliskt (högsta i omfånget).

I följande exempel körs endast trap with "whoops 1".

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

Viktigt!

En Trap -instruktion är begränsad till den plats där den kompileras. Om du har en trap-instruktion i en funktion eller i ett skript som hämtats med punktnotation, tas alla trap-instruktioner inuti bort när funktionen eller skriptet 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 innehöll nyckelordet break fortsätter inte funktionen att köras och raden "Funktionen har slutförts" körs inte.

Om du inkluderar ett continue-nyckelord i en trap-instruktion, återupptas PowerShell efter instruktionen som orsakade felet, precis som den skulle göra utan break eller continue. Med nyckelordet continue skriver PowerShell dock inte något 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 fångats och instruktionen "Funktionen har slutförts" körs. Inget fel skrivs till felströmmen.

Noteringar

trap Instruktioner är ett enkelt sätt att i stort sett se till att alla avslutande fel inom ett omfång hanteras. För mer finfördelad felhantering använder du try/catch block där traps definieras med hjälp av catch-instruktioner. De catch-uttrycken gäller endast för koden i den associerade try-instruktionen. Mer information finns i about_Try_Catch_Finally.

Se även