Over trap
Korte beschrijving
Beschrijft een trefwoord dat een beëindigingsfout afhandelt.
Lange beschrijving
Een afsluitfout voorkomt dat een instructie wordt uitgevoerd. Als PowerShell een afsluitfout op een bepaalde manier niet afhandelt, stopt PowerShell ook met het uitvoeren van de functie of het script in de huidige pijplijn. In andere talen, zoals C#, worden afsluitfouten uitzonderingen genoemd.
Het Trap
trefwoord geeft een lijst met instructies op die moeten worden uitgevoerd wanneer er een afsluitfout optreedt. Trap-instructies verwerken de afsluitfouten en staan de uitvoering van het script of de functie toe om door te gaan in plaats van te stoppen.
Trap-instructies kunnen ook complexer zijn. De instructielijst van de trap kan meerdere voorwaarden of functie-aanroepen bevatten. Een trap kan logboeken schrijven, voorwaarden testen of zelfs een ander programma uitvoeren.
Syntax
De trap-instructie heeft de volgende syntaxis:
trap [[<error type>]] {<statement list>}
De trap-instructie bevat een lijst met instructies die moeten worden uitgevoerd wanneer er een afsluitfout optreedt. Een trap-instructie bestaat uit het trap
trefwoord, optioneel gevolgd door een typeexpressie, en het instructieblok met de lijst met instructies die moeten worden uitgevoerd wanneer een fout is vastgelopen. De typeexpressie verfijnt de typen fouten die de trap vangt.
Een script of opdracht kan meerdere Trap-instructies hebben. Trap-instructies kunnen overal in het script of de opdracht worden weergegeven.
Alle afsluitfouten opsnisten
Wanneer er een afsluitfout optreedt die niet op een andere manier wordt verwerkt in een script of opdracht, controleert PowerShell op een Trap-instructie die de fout afhandelt. Als er een Trap-instructie aanwezig is, blijft PowerShell het script of de opdracht uitvoeren in de Trap-instructie.
Het volgende voorbeeld is een zeer eenvoudige Trap-instructie:
trap {"Error found."}
Met deze trap-instructie worden alle afsluitfouten overvallen.
In het volgende voorbeeld bevat de functie een onzintekenreeks die een runtimefout veroorzaakt.
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
Als u deze functie uitvoert, wordt het volgende geretourneerd:
Error found.
Het volgende voorbeeld bevat een trap-instructie waarmee de fout wordt weergegeven met behulp van de $_
automatische variabele:
function TrapTest {
trap {"Error found: $_"}
nonsenseString
}
TrapTest
Als u deze versie van de functie uitvoert, wordt het volgende geretourneerd:
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.
Belangrijk
Trap-instructies kunnen overal binnen een bepaald bereik worden gedefinieerd, maar zijn altijd van toepassing op alle instructies in dat bereik. Tijdens runtime worden traps in een blok gedefinieerd voordat andere instructies worden uitgevoerd. In JavaScript staat dit bekend als hijsen. Dit betekent dat traps van toepassing zijn op alle instructies in dat blok, zelfs als de uitvoering nog niet is gevorderd na het punt waarop ze zijn gedefinieerd. Als u bijvoorbeeld een trap aan het einde van een script definieert en een fout in de eerste instructie genereert, wordt deze trap nog steeds geactiveerd.
Specifieke fouten overvangen
Een script of opdracht kan meerdere Trap-instructies hebben. Traps kunnen worden gedefinieerd om specifieke fouten af te handelen.
Het volgende voorbeeld is een Trap-instructie waarmee de specifieke fout CommandNotFoundException wordt overvallen:
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
Wanneer een functie of script een tekenreeks aantreft die niet overeenkomt met een bekende opdracht, wordt met deze trap-instructie de tekenreeks 'Opdrachtfout vastgelopen' weergegeven. Nadat de Trap
instructielijst is uitgevoerd, schrijft PowerShell het foutobject naar de foutstroom en gaat vervolgens verder met het script.
PowerShell maakt gebruik van de microsoft-.NET Framework uitzonderingstypen. In het volgende voorbeeld wordt het fouttype System.Exception opgegeven:
trap [System.Exception] {"An error trapped"}
Het fouttype CommandNotFoundException neemt het type System.Exception over. Met deze instructie wordt een fout overvallen die is gemaakt door een onbekende opdracht. Er worden ook andere fouttypen in de val gezet.
U kunt meer dan één Trap-instructie in een script hebben. Elk fouttype kan worden vastgelopen door slechts één Trap-instructie. Wanneer er een beëindigingsfout optreedt, zoekt PowerShell naar de trap met de meest specifieke overeenkomst, te beginnen in het huidige uitvoeringsbereik.
Het volgende scriptvoorbeeld bevat een fout. Het script bevat een algemene trap-instructie waarmee een afsluitfout wordt overvallen en een specifieke Trap
instructie die het type CommandNotFoundException opgeeft.
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
"Command error trapped"
}
nonsenseString
Als u dit script uitvoert, wordt het volgende resultaat gegenereerd:
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
Omdat 'nonsenseString' niet wordt herkend als een cmdlet of ander item, wordt een CommandNotFoundException-fout geretourneerd. Deze afsluitfout wordt vastgelopen door de specifieke trap-instructie.
Het volgende scriptvoorbeeld bevat dezelfde Trap-instructies met een andere fout:
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
Als u dit script uitvoert, wordt het volgende resultaat gegenereerd:
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
De poging om door nul te delen, veroorzaakt geen CommandNotFoundException-fout . In plaats daarvan wordt deze fout gevangen door de andere Trap-instructie, waarmee een afsluitfout wordt overvallen.
Fouten en bereik van overvulling
Als er een afsluitfout optreedt in hetzelfde bereik als de trap-instructie, voert PowerShell de lijst met instructies uit die zijn gedefinieerd door de trap. De uitvoering wordt voortgezet bij de instructie na de fout. Als de trap-instructie zich in een ander bereik bevindt dan de fout, wordt de uitvoering voortgezet bij de volgende instructie die zich in hetzelfde bereik bevindt als de trap-instructie.
Als er bijvoorbeeld een fout optreedt in een functie en de instructie Trap zich in de functie bevindt, gaat het script verder bij de volgende instructie. Het volgende script bevat een fout en een trap-instructie:
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
Verderop in het script produceert het uitvoeren van de functie Function1 het volgende resultaat:
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
Met de instructie Trap in de functie wordt de fout overvallen. Nadat het bericht is weergegeven, wordt de functie in PowerShell hervat. Merk op dat Function1
is voltooid.
Vergelijk dit met het volgende voorbeeld, dat dezelfde fout en Trap
instructie heeft. In dit voorbeeld vindt de trap-instructie plaats buiten de functie:
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
function2
Als u de Function2
functie uitvoert, wordt het volgende resultaat gegenereerd:
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 <<<<
In dit voorbeeld is de opdracht 'function2 is completed' niet uitgevoerd. In beide voorbeelden treedt de afsluitfout op binnen de functie. In dit voorbeeld valt de instructie Trap echter buiten de functie. PowerShell gaat niet terug naar de functie nadat de Trap-instructie is uitgevoerd.
Waarschuwing
Wanneer er meerdere traps worden gedefinieerd voor dezelfde foutvoorwaarde, wordt de eerste trap gebruikt die lexicaal is gedefinieerd (hoogste in het bereik).
In het volgende voorbeeld wordt alleen de trap met 'whoops 1' uitgevoerd.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
break
De trefwoorden en continue
gebruiken
U kunt de Break
trefwoorden en Continue
in een Trap-instructie gebruiken om te bepalen of een script of opdracht nog steeds wordt uitgevoerd na een afsluitfout.
Als u een instructie in een Break
trap-instructielijst opneemt, stopt PowerShell de functie of het script. De volgende voorbeeldfunctie gebruikt het Break
trefwoord in een trap-instructie:
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
Omdat de instructie Trap het Break
trefwoord bevat, wordt de functie niet meer uitgevoerd en wordt de regel 'Functie voltooid' niet uitgevoerd.
Als u een Continue
-instructie in een trap-instructie opneemt, wordt PowerShell hervat na de instructie die de fout heeft veroorzaakt, net zoals zonder Break
of Continue
. Met het Continue
trefwoord schrijft PowerShell echter geen fout naar de foutenstroom.
De volgende voorbeeldfunctie gebruikt het Continue
trefwoord in een Trap
-instructie:
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
De functie wordt hervat nadat de fout is vastgelopen en de instructie 'Functie voltooid' wordt uitgevoerd. Er wordt geen fout naar de foutenstroom geschreven.
Notities
Trap-instructies bieden een eenvoudige manier om ervoor te zorgen dat alle afsluitfouten binnen een bereik worden verwerkt. Voor een nauwkeurigere foutafhandeling gebruikt try
/catch
u blokken waarbij traps worden gedefinieerd met behulp van Catch
-instructies. De Catch
instructies zijn alleen van toepassing op de code in de bijbehorende Try
instructie. Zie about_Try_Catch_Finally voor meer informatie.