Om 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 hanterar avslutande fel och tillåter att körningen av skriptet eller funktionen fortsätter i stället för att stoppa.
Trap-instruktioner kan också vara mer komplexa. Instruktionslistan för 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
Trap-instruktionen 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 trapn 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 en mycket enkel Trap-instruktion:
trap {"Error found."}
Den här trap-instruktionen genererar traps för 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:
Error found.
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 then try
again.
Viktigt
Trap-instruktioner kan definieras var som helst inom ett visst omfång, men gäller alltid för alla -instruktioner i det omfånget. Vid körning definieras traps i ett block innan andra instruktioner körs. I JavaScript kallas detta hissning. Det innebär att traps gäller för alla instruktioner i blocket även om körningen inte har avancerat 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 utlöses den trapn.
Fånga specifika fel
Ett skript eller kommando kan ha flera Trap-instruktioner. Traps kan definieras för att hantera specifika fel.
Följande exempel är en Trap-instruktion som genererar traps för 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ångade". När du har kört instruktionslistan Trap
skriver PowerShell felobjektet till felströmmen och fortsätter sedan skriptet.
PowerShell använder Undantagstyper för Microsoft .NET Framework. 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 genererar ett fel som skapas med ett okänt kommando. Den genererar också andra feltyper.
Du kan ha mer än en Trap-instruktion i ett skript. Varje feltyp kan bara fångas av en Trap-instruktion. När ett avslutande fel inträffar söker PowerShell efter trapsen med 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 genererar traps för 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 : 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.
At C:\temp\test\traptest.ps1:5 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Eftersom PowerShell inte känner igen "nonsenseString" som en cmdlet eller något annat objekt returneras ett CommandNotFoundException-fel . Det här avslutande felet fångas 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
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Försöket att dividera med noll skapar inte ett CommandNotFoundException-fel . I stället fångas det felet av den andra Trap-instruktionen, som genererar traps för avslutande fel.
Fånga fel och omfång
Om ett avslutande fel inträffar i samma omfång som Trap-instruktionen kör PowerShell listan med instruktioner som definierats av trapn. Körningen fortsätter vid -instruktionen efter felet. Om trap-instruktionen finns i ett annat omfång än felet fortsätter körningen vid nästa -instruktion som finns i samma omfång som Trap-instruktionen.
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"
}
Senare i skriptet ger körningen av funktionen Function1 följande resultat:
function1
An error:
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
then try again.
At C:\PS>TestScript1.ps1:3 char:19
+ NonsenseString <<<<
function1 was completed
Trap-instruktionen i funktionen genererar traps för felet. När du har visat meddelandet fortsätter PowerShell att köra funktionen. Observera att Function1
har slutförts.
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
När du Function2
kör funktionen genereras följande resultat:
An error:
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
then try again.
At C:\PS>TestScript2.ps1:4 char:19
+ NonsenseString <<<<
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 efter att Trap-instruktionen har körts.
Varning
När flera traps har definierats för samma felvillkor används den första svällningen som definieras lexikalt (högst i omfånget).
I följande exempel körs bara trap med "whoops 1".
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
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
Attempted to divide by zero.
At line:4 char:7
Eftersom trap-instruktionen inkluderade nyckelordet Break
fortsätter inte funktionen att köras och raden "Funktionen har slutförts" körs inte.
Om du inkluderar en Continue
-instruktion 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 "Funktionen har slutförts" körs. Inget fel skrivs till felströmmen.
Kommentarer
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 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.