about_Trap
Korte beschrijving
Beschrijft een trefwoord dat een afsluitfout afhandelt.
Lange beschrijving
Een afsluitfout voorkomt dat een instructie wordt uitgevoerd. Als PowerShell op een of andere manier geen afsluitfout afhandelt, stopt PowerShell ook met het uitvoeren van de functie of het script in de huidige pijplijn. In andere talen, zoals C#, worden afsluitfouten ook wel uitzonderingen genoemd.
Het trap
trefwoord geeft een lijst met instructies op die moeten worden uitgevoerd wanneer er een afsluitfout optreedt. trap
instructies kunnen de afsluitfouten op de volgende manieren afhandelen:
Geef de fout weer na het verwerken van het
trap
instructieblok en continue uitvoering van het script of de functie met detrap
. Dit gedrag is de standaardinstelling.Notitie
Wanneer de afsluitfout optreedt in een onderliggend scriptblok, zoals een
if
instructie offoreach
lus, worden de instructies in hettrap
blok uitgevoerd en wordt de uitvoering voortgezet op de volgende instructie buiten het onderliggende scriptblok.De fout weergeven en de uitvoering van het script of de functie met het
trap
gebruikbreak
in detrap
instructie afbreken.De fout dempen, maar doorgaan met het uitvoeren van het script of de functie met behulp
trap
vancontinue
detrap
instructie.
De instructielijst van de trap
lijst kan meerdere voorwaarden of functie-aanroepen bevatten. Een trap
kan logboeken, testvoorwaarden schrijven of zelfs een ander programma uitvoeren.
Syntaxis
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, eventueel gevolgd door een type-expressie en het instructieblok met de lijst met instructies die moeten worden uitgevoerd wanneer een fout wordt gevangen. De typeexpressie verfijnt de typen fouten die de trap
vangsten veroorzaken.
Een script of opdracht kan meerdere trap
instructies bevatten. trap
instructies kunnen overal in het script of de opdracht worden weergegeven.
Alle afsluitfouten ondervangen
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, voert PowerShell het script of de opdracht in de trap
instructie uit.
Het volgende voorbeeld is een minimale trap
instructie:
trap { 'Error found.' }
Met deze trap
instructie wordt elke afsluitfout onderschepd.
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 de volgende uitvoer geretourneerd:
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.
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 de volgende uitvoer 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
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.
Belangrijk
trap
instructies kunnen overal binnen een bepaald scriptblok worden gedefinieerd, maar zijn altijd van toepassing op alle instructies in dat scriptblok. Tijdens runtime trap
worden instructies in een blok gedefinieerd voordat andere instructies worden uitgevoerd.
In JavaScript staat dit bekend als hijsen. Dit betekent dat trap
instructies van toepassing zijn op alle instructies in dat blok, zelfs als de uitvoering nog niet is verstreken vanaf het punt waarop ze zijn gedefinieerd. Als u bijvoorbeeld een trap
script aan het einde van een script definieert en een fout genereert in de eerste instructie, wordt dat trap
nog steeds geactiveerd.
Specifieke fouten ondervangen
Een script of opdracht kan meerdere trap
instructies bevatten. Een trap
kan worden gedefinieerd om specifieke fouten af te handelen.
Het volgende voorbeeld is een trap
instructie die de specifieke fout CommandNotFoundException trapt:
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
Wanneer een functie of script een tekenreeks tegenkomt die niet overeenkomt met een bekende opdracht, geeft deze trap
instructie de Command error trapped
tekenreeks weer.
Na het uitvoeren van de trap
instructielijst schrijft PowerShell het foutobject naar de foutstroom en gaat het script vervolgens verder.
PowerShell maakt gebruik van .NET-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. Deze instructie trapt eventuele fouten die worden gegenereerd door onbekende opdrachten. Er worden ook andere fouttypen onderschepd.
U kunt het uitzonderingstype voor een fout vinden door het foutobject te controleren. In het volgende voorbeeld ziet u hoe u de volledige naam van de uitzondering voor de laatste fout in een sessie kunt ophalen:
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
U kunt meer dan één trap
instructie in een script hebben. Slechts één trap
instructie kan elk fouttype onderschept. Wanneer er een afsluitfout optreedt, zoekt PowerShell naar de trap
meest specifieke overeenkomst, te beginnen in het huidige scriptblok van de uitvoering.
Het volgende scriptvoorbeeld bevat een fout. Het script bevat een algemene trap
instructie waarmee een afsluitfout wordt onderschept en een specifieke trap
instructie waarmee het type CommandNotFoundException wordt opgegeven.
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:
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.
Omdat PowerShell niet herkent nonsenseString
als een cmdlet of ander item, wordt er een CommandNotFoundException-fout geretourneerd. De specifieke trap
instructie trapt deze afsluitfout.
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
RuntimeException:
Line |
5 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
De poging om te delen door nul maakt geen CommandNotFoundException-fout . De andere trap
instructie, die een afsluitfout ondervangt, trapt de verdeling door nul.
Fouten in een scriptblok ondervangen
Wanneer er een afsluitfout optreedt, wordt de uitvoering standaard overgedragen naar de trapinstructie. Nadat het trap
blok is uitgevoerd, keert het besturingselement terug naar het volgende instructieblok na de locatie van de fout.
Als er bijvoorbeeld een afsluitfout optreedt in een foreach
instructie, wordt de trap
instructie uitgevoerd en wordt de uitvoering voortgezet bij de volgende instructie na het foreach
blok, niet binnen het foreach
blok.
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!
RuntimeException:
Line |
4 | "`t$(1/$x)"
| ~~~~
| Attempted to divide by zero.
after loop
In de uitvoer ziet u dat de lussen doorgaan tot de laatste iteratie. Wanneer het script probeert 1 door 0 te delen, genereert PowerShell een afsluitfout. Het script slaat de rest van het foreach
scriptblok over, voert de try
instructie uit en gaat verder na het foreach
scriptblok.
Fouten en bereik insluiten
Als er een afsluitfout optreedt in hetzelfde scriptblok als de trap
instructie, voert PowerShell de lijst met instructies uit die zijn gedefinieerd door de trap
. Uitvoering wordt voortgezet op de instructie na de fout. Als de trap
instructie zich in een ander scriptblok bevindt dan de fout, gaat de uitvoering verder met de volgende instructie die zich in hetzelfde scriptblok bevindt als de trap
instructie.
Als er bijvoorbeeld een fout optreedt in een functie en de trap
instructie zich in de functie bevindt, gaat het script verder met de volgende instructie. Het volgende script bevat een fout en een trap
instructie:
function function1 {
trap { 'An error: ' }
NonsenseString
'function1 was completed'
}
function1
Als u dit script uitvoert, wordt het volgende resultaat gegenereerd:
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
De trap
instructie in de functie trapt de fout. Nadat het bericht is weergegeven, wordt de functie door PowerShell hervat. U ziet dat Function1
dit is voltooid na de trap
instructie.
Vergelijk dit gedrag met het volgende voorbeeld, met dezelfde fout en trap
instructie. 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:
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.
In dit voorbeeld is de function2 was completed
opdracht niet uitgevoerd. In beide voorbeelden treedt de afsluitfout op binnen de functie. In dit voorbeeld bevindt de trap
instructie zich echter buiten de functie. PowerShell gaat niet terug naar de functie nadat de trap
instructie is uitgevoerd.
Let op
Wanneer er meerdere traps worden gedefinieerd voor dezelfde foutvoorwaarde, wordt de eerste trap
gedefinieerde lexiek (hoogste in het scriptblok) gebruikt.
In het volgende voorbeeld worden alleen de trap
uitvoeringen uitgevoerd whoops 1
.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Belangrijk
Een trap
instructie is gericht op de locatie waar deze wordt gecompileerd. Als u een trap
instructie in een functie- of puntbronscript hebt, worden alle trap
instructies verwijderd wanneer de functie of het puntbronscript wordt afgesloten.
Het einde gebruiken en trefwoorden voortzetten
U kunt de break
en continue
trefwoorden in een trap
instructie gebruiken om te bepalen of een script of opdracht blijft worden uitgevoerd na een afsluitfout.
Als u een break
instructie opneemt in een trap
instructielijst, 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
ParentContainsErrorRecordException:
Line |
6 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
Omdat de trap
instructie het break
trefwoord bevat, blijft de functie niet actief en wordt de Function completed
regel niet uitgevoerd.
Als u een continue
trefwoord 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 foutstroom.
De volgende voorbeeldfunctie gebruikt het continue
trefwoord in een trap
instructie:
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
De functie wordt hervat nadat de fout is vastgelopen en de End of function
instructie wordt uitgevoerd. Er wordt geen fout naar de foutstroom geschreven.
Opmerkingen
trap
instructies bieden een manier om ervoor te zorgen dat alle afsluitfouten in een scriptblok worden verwerkt. Gebruik blokken waarin traps worden gedefinieerd met behulp van instructies voor nauwkeurigere foutafhandelingtry
catch
/.catch
De catch
instructies zijn alleen van toepassing op de code in de bijbehorende try
instructie. Zie about_Try_Catch_Finally voor meer informatie.