about_Try_Catch_Finally
Korte beschrijving
Beschrijft hoe u de , try
en catch
blokken gebruikt voor het finally
afhandelen van afsluitfouten.
Lange beschrijving
Gebruik try
, catch
en 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 catch
een geschikte catch
instructie in de bovenliggende Trap
bereiken. Nadat een catch
blok is voltooid of als er geen geschikt blok of catch
instructie Trap
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
, catch
en finally
lijkt op de try
, catch
en 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+ 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+ 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.doc
en 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.
In het volgende voorbeeld probeert het try
blok een bestand te downloaden naar de map c:\temp
. De catch
blokken verwerken fouten die optreden tijdens het downloaden. Het finally
blok verwijdert het WebClient
object en verwijdert het tijdelijke bestand als het bestaat.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "c:\temp\MyDoc.doc"
$wc.DownloadFile("http://www.contoso.com/MyDoc.doc",$tempFile)
} 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."
} finally {
$wc.Dispose()
if (Test-Path $tempPath) { Remove-item $tempFile }
}