Dela via


about_Try_Catch_Finally

Kort beskrivning

Beskriver hur du använder blocken try, catchoch finally för att hantera avslutande fel.

Lång beskrivning

Använd try, catchoch 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, catchoch 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.dococh 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.

Se även