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 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 instruktionsblocket
trap
och fortsatt körning av skriptet eller funktionen som innehållertrap
. Det här beteendet är standard.Kommentar
När det avslutande felet inträffar i ett underordnat skriptblock, till exempel en
if
instruktion ellerforeach
loop, körs -uttryckentrap
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ändningbreak
i -instruktionentrap
.Tysta felet, men fortsätt körningen av skriptet eller funktionen som innehåller
trap
med hjälpcontinue
av i -instruktionentrap
.
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
- trap
instruktionen 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 fångas. Typuttrycket förfinar de typer av fel som fångsterna trap
innehåller.
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 fångar upp 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 : 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 line:3 char:5
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
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 : 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 line:3 char:5
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
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 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 det 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 fångar det specifika felet CommandNotFoundException:
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
När en funktion eller ett skript stöter på 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 fångar upp eventuella fel som genereras av okända kommandon. Den fångar också 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 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 line:1 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
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 mest specifika matchningen, med början i det aktuella skriptblocket för trap
körning.
Följande skriptexempel innehåller ett fel. Skriptet innehåller en allmän trap
instruktion som fångar upp 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 : 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 line: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 . Den specifika trap
instruktionen fångar upp 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
Attempted to divide by zero.
At line:5 char:1
+ 1/$null}
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Försöket att dividera med noll skapar inte ett CommandNotFoundException-fel . Den andra trap
instruktionen, som genererar ett avslutande fel, trapsar divideringen 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. När blocket trap
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 -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..-1) {
"1/$x = "
"`t$(1/$x)"
}
'after loop'
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
An error occurred!
Attempted to divide by zero.
At line:3 char:4
+ 1/$x
+ ~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
after loop
I utdata kan du se att looparna fortsätter till den sista 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 med instruktioner som definierats 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 ett fel till exempel 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 : 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 line:3 char:5
+ NonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (NonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
function1 was completed
Instruktionen trap
i funktionen fångar upp felet. När meddelandet har visats återupptar PowerShell körningen av funktionen. Observera att den Function1
har 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
Om du Function2
kör funktionen får du följande resultat:
An error:
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 line:2 char:5
+ NonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (NonsenseString:String) []
, CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
I det här exemplet function2 was completed
kördes inte kommandot. I båda exemplen uppstår det avslutande felet i funktionen. I det här exemplet ligger dock -instruktionen trap
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
definierade 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, när funktionen eller punktkällskriptet avslutas, tas alla trap
instruktioner inuti bort.
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:6 char:5
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], ParentContainsErrorR
ecordException
+ FullyQualifiedErrorId : RuntimeException
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 ContinueExample {
trap {
'Error trapped'
continue
}
foreach ($x in 3..-1) {
"1/$x = "
"`t$(1/$x)"
}
'End of function'
}
ContinueExample
1/3 =
0.333333333333333
1/2 =
0.5
1/1 =
1
1/0 =
Error trapped
End of function
Funktionen återupptas när felet har fastnat och -instruktionen End of function
körs. Inget fel skrivs till felströmmen.
Kommentar
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. -uttrycken catch
gäller endast för koden i den associerade try
instruktionen. Mer information finns i about_Try_Catch_Finally.