about_Try_Catch_Finally
Kort beskrivning
Beskriver hur du använder blocken try
, catch
och finally
för att hantera avslutande fel.
Lång beskrivning
Använd try
, catch
och finally
-block för att svara på eller hantera avslutande fel i skript. -instruktionen Trap
kan också användas för att hantera avslutande fel i skript. Mer information finns i about_Trap.
Ett avslutande fel hindrar en instruktion från att köras. Om PowerShell inte hanterar ett avslutande fel på något sätt slutar PowerShell också att köra funktionen eller skriptet med den aktuella pipelinen. På andra språk, till exempel C#, kallas avslutande fel för undantag.
Använd blocket try
för att definiera ett avsnitt i ett skript där du vill att PowerShell ska övervaka fel. När ett fel inträffar i try
blocket sparas felet först i den $Error
automatiska variabeln. PowerShell söker sedan efter ett catch
block för att hantera felet. Om -instruktionen try
inte har något matchande catch
block fortsätter PowerShell att söka efter ett lämpligt block eller Trap
en instruktion catch
i de överordnade omfången. När ett catch
block har slutförts eller om inget lämpligt catch
block eller Trap
instruktion hittas finally
körs blocket. Om felet inte kan hanteras skrivs felet till felströmmen.
Ett catch
block kan innehålla kommandon för att spåra felet eller för att återställa det förväntade flödet i skriptet. Ett catch
block kan ange vilka feltyper det fångar upp. En try
instruktion kan innehålla flera catch
block för olika typer av fel.
Ett finally
block kan användas för att frigöra resurser som inte längre behövs av skriptet.
try
, catch
, och finally
liknar nyckelorden try
, catch
och finally
som används i programmeringsspråket C#.
Syntax
En try
instruktion innehåller ett try
block, noll eller fler catch
block och noll eller ett finally
block. En try
instruktion måste ha minst ett catch
block eller ett finally
block.
Följande visar blocksyntaxen try
:
try {<statement list>}
Nyckelordet try
följs av en instruktionslista i klammerparenteser. Om ett avslutande fel inträffar när uttrycken i instruktionslistan körs skickar skriptet felobjektet try
från blocket till ett lämpligt catch
block.
Följande visar blocksyntaxen catch
:
catch [[<error type>][',' <error type>]*] {<statement list>}
Feltyper visas inom hakparenteser. De yttersta hakparenteserna anger att elementet är valfritt.
Nyckelordet catch
följs av en valfri lista med feltypsspecifikationer och en instruktionslista. Om ett avslutande fel inträffar i try
blocket söker PowerShell efter ett lämpligt catch
block. Om en hittas körs -uttrycken catch
i blocket.
Blocket catch
kan ange en eller flera feltyper. En feltyp är ett Microsoft .NET Framework-undantag eller ett undantag som härleds från ett .NET Framework-undantag. Ett catch
block hanterar fel i den angivna .NET Framework-undantagsklassen eller någon klass som härleds från den angivna klassen.
Om ett catch
block anger en feltyp hanterar blocket catch
den typen av fel. Om ett catch
block inte anger någon feltyp hanterar det catch
blocket eventuella fel som påträffas i try
blocket. En try
instruktion kan innehålla flera catch
block för de olika angivna feltyperna.
Följande visar blocksyntaxen finally
:
finally {<statement list>}
Nyckelordet finally
följs av en instruktionslista som körs varje gång skriptet körs, även om -instruktionen try
kördes utan fel eller om ett fel fångades i en catch
-instruktion.
Observera att om du trycker på CTRL+C stoppas pipelinen. Objekt som skickas till pipelinen visas inte som utdata. Om du inkluderar en instruktion som ska visas, till exempel "Slutligen blockera har körts", visas den därför inte när du trycker på CTRL+C, även om finally
blocket kördes.
Fånga upp fel
Följande exempelskript visar ett try
block med ett catch
block:
try { NonsenseString }
catch { "An error occurred." }
Nyckelordet catch
måste omedelbart följa try
blocket eller ett annat catch
block.
PowerShell känner inte igen "NonsenseString" som en cmdlet eller något annat objekt. Om du kör det här skriptet returneras följande resultat:
An error occurred.
När skriptet stöter på "NonsenseString" orsakar det ett avslutande fel. Blocket catch
hanterar felet genom att köra instruktionslistan i blocket.
Använda flera catch-instruktioner
En try
instruktion kan ha valfritt antal catch
block. Följande skript har till exempel ett try
block som laddar ned MyDoc.doc
och innehåller två catch
block:
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."
}
Det första catch
blocket hanterar fel i typerna System.Net.WebException och System.IO.IOException . Det andra catch
blocket anger ingen feltyp. Det andra catch
blocket hanterar andra avslutande fel som inträffar.
PowerShell matchar feltyper efter arv. Ett catch
block hanterar fel i den angivna .NET Framework-undantagsklassen eller någon klass som härleds från den angivna klassen. Följande exempel innehåller ett catch
block som fångar upp felet "Kommandot hittades inte":
catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }
Den angivna feltypen CommandNotFoundException ärver från typen System.SystemException . I följande exempel visas även ett felmeddelande om att kommandot inte hittades:
catch [System.SystemException] {"Base Exception" }
Det här catch
blocket hanterar felet "Kommandot hittades inte" och andra fel som ärver från SystemException-typen .
Om du anger en felklass och en av dess härledda klasser placerar catch
du blocket för den härledda klassen före catch
blocket för den allmänna klassen.
Kommentar
PowerShell omsluter alla undantag i en RuntimeException-typ . Att ange feltypen System.Management.Automation.RuntimeException fungerar därför på samma sätt som ett okvalificerat catch-block.
Använda traps i en försöksfångst
När ett avslutande fel inträffar i ett try
block med en Trap
definierad i try
blocket, även om det finns ett matchande catch
block, tar instruktionen Trap
kontroll.
Om en Trap
finns på ett högre block än try
, och det inte finns något matchande catch
block inom det aktuella omfånget, tar kontrollen Trap
, även om något överordnat omfång har ett matchande catch
block.
Åtkomst till undantagsinformation
I ett catch
block kan det aktuella felet nås med hjälp av $_
, som även kallas $PSItem
. Objektet är av typen ErrorRecord.
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_
}
Om du kör det här skriptet returneras följande resultat:
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.
Det finns ytterligare egenskaper som kan nås, till exempel ScriptStackTrace, Exception och ErrorDetails. Om vi till exempel ändrar skriptet till följande:
try { NonsenseString }
catch {
Write-Host "An error occurred:"
Write-Host $_.ScriptStackTrace
}
Resultatet kommer att likna:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Frigör resurser med hjälp av slutligen
Om du vill frigöra resurser som används av ett skript lägger du till ett finally
block efter blocken try
och catch
. Blockinstruktionerna finally
körs oavsett om blocket try
stöter på ett avslutande fel. PowerShell kör finally
blocket innan skriptet avslutas eller innan det aktuella blocket hamnar utanför omfånget.
Ett finally
block körs även om du använder CTRL+C för att stoppa skriptet. Ett finally
block körs också om ett exit-nyckelord stoppar skriptet inifrån ett catch
block.