Delen via


about_Try_Catch_Finally

Korte beschrijving

Beschrijft hoe u de , catchen finally blokken gebruikt voor het tryafhandelen van afsluitfouten.

Lange beschrijving

Gebruik try, catchen finally blokken om te reageren op of af te handelen in scripts. De Trap instructie kan ook worden gebruikt voor het afhandelen van afsluitfouten in scripts. Zie about_Trap voor meer informatie.

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 met behulp van de huidige pijplijn. In andere talen, zoals C#, worden afsluitfouten aangeduid als uitzonderingen.

Gebruik het try blok om een sectie van een script te definiëren waarin u wilt dat PowerShell controleert op fouten. Wanneer er een fout optreedt in het try blok, wordt de fout eerst opgeslagen in de $Error automatische variabele. PowerShell zoekt vervolgens naar een catch blok om de fout te verwerken. Als de try instructie geen overeenkomend blok heeft, blijft PowerShell zoeken naar een geschikt blok of Trap een geschikte catch instructie in de bovenliggende catch bereiken. Nadat een catch blok is voltooid of als er geen geschikt blok of Trap instructie catch wordt gevonden, wordt het finally blok uitgevoerd. Als de fout niet kan worden verwerkt, wordt de fout naar de foutstroom geschreven.

Een catch blok kan opdrachten bevatten voor het bijhouden van de fout of voor het herstellen van de verwachte stroom van het script. Een catch blok kan opgeven welke fouttypen worden onderschept. Een try instructie kan meerdere catch blokken bevatten voor verschillende soorten fouten.

Een finally blok kan worden gebruikt om resources te vrij te maken die niet meer nodig zijn voor uw script.

try, catchen finally lijkt op de try, catchen finally trefwoorden die worden gebruikt in de C#-programmeertaal.

Syntaxis

Een try instructie bevat een try blok, nul of meer catch blokken en nul of één finally blok. Een try instructie moet ten minste één catch blok of één finally blok bevatten.

Hieronder ziet u de try bloksyntaxis:

try {<statement list>}

Het try trefwoord wordt gevolgd door een instructielijst in accolades. Als er een afsluitfout optreedt terwijl de instructies in de instructielijst worden uitgevoerd, geeft het script het foutobject van het try blok door aan een geschikt catch blok.

Hieronder ziet u de catch bloksyntaxis:

catch [[<error type>][',' <error type>]*] {<statement list>}

Fouttypen worden tussen vierkante haken weergegeven. De buitenste haken geven aan dat het element optioneel is.

Het catch trefwoord wordt gevolgd door een optionele lijst met specificaties voor fouttypen en een lijst met instructies. Als er een afsluitfout optreedt in het try blok, zoekt PowerShell naar een geschikt catch blok. Als er een wordt gevonden, worden de instructies in het catch blok uitgevoerd.

Het catch blok kan een of meer fouttypen opgeven. Een fouttype is een Microsoft .NET Framework-uitzondering of een uitzondering die is afgeleid van een .NET Framework-uitzondering. Een catch blok verwerkt fouten van de opgegeven .NET Framework-uitzonderingsklasse of van een klasse die is afgeleid van de opgegeven klasse.

Als een catch blok een fouttype opgeeft, verwerkt dat catch blok dat type fout. Als een catch blok geen fouttype opgeeft, verwerkt dat catch blok eventuele fouten die in het try blok zijn opgetreden. Een try instructie kan meerdere catch blokken bevatten voor de verschillende opgegeven fouttypen.

Hieronder ziet u de finally bloksyntaxis:

finally {<statement list>}

Het finally trefwoord wordt gevolgd door een instructielijst die wordt uitgevoerd telkens wanneer het script wordt uitgevoerd, zelfs als de try instructie zonder fout is uitgevoerd of als er een fout is opgetreden in een catch instructie.

Houd er rekening mee dat als u op Ctrl+C drukt, de pijplijn stopt. Objecten die naar de pijplijn worden verzonden, worden niet weergegeven als uitvoer. Als u daarom een instructie opneemt die moet worden weergegeven, zoals 'Definitief blok is uitgevoerd', wordt deze niet weergegeven nadat u op Ctrl+C hebt geklikt, zelfs niet als het finally blok is uitgevoerd.

Fouten waarnemen

In het volgende voorbeeldscript ziet u een try blok met een catch blok:

try { NonsenseString }
catch { "An error occurred." }

Het catch trefwoord moet onmiddellijk volgen op het try blok of een ander catch blok.

In PowerShell wordt 'NonsenseString' niet herkend als een cmdlet of ander item. Als u dit script uitvoert, wordt het volgende resultaat geretourneerd:

An error occurred.

Wanneer het script 'NonsenseString' tegenkomt, veroorzaakt het een afsluitfout. Het catch blok verwerkt de fout door de lijst met instructies in het blok uit te voeren.

Meerdere catch-instructies gebruiken

Een try instructie kan een willekeurig aantal catch blokken bevatten. Het volgende script heeft bijvoorbeeld een try blok dat wordt gedownload MyDoc.docen bevat twee catch blokken:

try {
   $wc = new-object System.Net.WebClient
   $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
    "Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
    "An error occurred that could not be resolved."
}

Het eerste catch blok verwerkt fouten van de typen System.Net.WebException en System.IO.IOException . Het tweede catch blok geeft geen fouttype op. Het tweede catch blok verwerkt eventuele andere afsluitfouten die optreden.

PowerShell komt overeen met fouttypen per overname. Een catch blok verwerkt fouten van de opgegeven .NET Framework-uitzonderingsklasse of van een klasse die is afgeleid van de opgegeven klasse. Het volgende voorbeeld bevat een catch blok waarmee de fout 'Opdracht niet gevonden' wordt onderschept:

catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }

Het opgegeven fouttype CommandNotFoundException neemt het type System.SystemException over. In het volgende voorbeeld wordt ook een fout 'Opdracht niet gevonden' onderschept:

catch [System.SystemException] {"Base Exception" }

Dit catch blok verwerkt de fout 'Opdracht niet gevonden' en andere fouten die overnemen van het type SystemException .

Als u een foutklasse en een van de afgeleide klassen opgeeft, plaatst u het catch blok voor de afgeleide klasse vóór het catch blok voor de algemene klasse.

Notitie

PowerShell verpakt alle uitzonderingen in een RuntimeException-type . Daarom gedraagt het opgeven van het fouttype System.Management.Automation.RuntimeException zich hetzelfde als een niet-gekwalificeerde catch-blok.

Traps gebruiken in een Try Catch

Wanneer er een afsluitfout optreedt in een try blok met een Trap gedefinieerde try blok, zelfs als er een overeenkomend catch blok is, krijgt de Trap instructie de controle.

Als er een Trap hoger blok bestaat dan het try, en er geen overeenkomend catch blok binnen het huidige bereik is, neemt de Trap controle over, zelfs als een bovenliggend bereik een overeenkomend catch blok heeft.

Toegang tot uitzonderingsgegevens

Binnen een catch blok kan de huidige fout worden geopend met behulp van $_, ook wel bekend als $PSItem. Het object is van het type ErrorRecord.

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

Als u dit script uitvoert, wordt het volgende resultaat geretourneerd:

An Error occurred:
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.

Er zijn extra eigenschappen die kunnen worden geopend, zoals ScriptStackTrace, Exception en ErrorDetails. Als we bijvoorbeeld het script wijzigen in het volgende:

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_.ScriptStackTrace
}

Het resultaat is vergelijkbaar met:

An Error occurred:
at <ScriptBlock>, <No file>: line 2

Resources vrijmaken met ten slotte

Als u resources wilt vrijhouden die door een script worden gebruikt, voegt u een finally blok toe na de try en catch blokken. De finally blokinstructies worden uitgevoerd, ongeacht of het try blok een afsluitfout tegenkomt. PowerShell voert het finally blok uit voordat het script wordt beëindigd of voordat het huidige blok buiten het bereik valt.

Een finally blok wordt uitgevoerd, zelfs als u Ctrl C+ gebruikt om het script te stoppen. Een finally blok wordt ook uitgevoerd als een trefwoord Afsluiten het script vanuit een catch blok stopt.

Zie ook