Delen via


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.

Zie ook

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally