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 å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, catchoch finally liknar nyckelorden try, catchoch finally som används i programmeringsspråket C#.

Syntax

En try instruktion innehåller ett try block, noll eller flera 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 instruktionerna 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 över feltypsspecifikationer och en instruktionslista. Om ett avslutande fel inträffar i try blocket söker PowerShell efter ett lämpligt catch block. Om någon 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 för någon klass som härleds från den angivna klassen.

Om ett catch block anger en feltyp hanterar det catch blocket 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 "Blockera äntligen har körts", visas den därför inte när du trycker på CTRL+C, även om finally blocket kördes.

Fånga fel

Följande exempelskript visar ett try block med ett catch block:

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

Nyckelordet catchtry måste omedelbart följa blocket eller ett annat catch block.

PowerShell känner inte igen "NonsenseString" som en cmdlet eller något annat objekt. När du kör det här skriptet returneras följande resultat:

An error occurred.

När skriptet påträffar "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 för 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 för 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.

Anteckning

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 Trap , tar kontrollen, ä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 $_
}

När 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 ser ut ungefär så här:

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

Frigöra 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 påträffar 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 från ett catch block.

Se även