about_Try_Catch_Finally

Krátký popis

Popisuje, jak používat try, catcha finally bloky ke zpracování ukončovací chyby.

Dlouhý popis

Funkce try, catcha finally bloky slouží k reagování na ukončovací chyby ve skriptech nebo jejich zpracování. Tento Trap příkaz lze také použít ke zpracování ukončování chyb ve skriptech. Další informace najdete v tématu about_Trap.

Ukončující chyba zastaví spuštění příkazu. Pokud PowerShell nějakým způsobem nezpracuje ukončující chybu, PowerShell také přestane spouštět funkci nebo skript pomocí aktuálního kanálu. V jiných jazycích, jako je C#, se ukončovací chyby označují jako výjimky.

try Pomocí bloku definujte oddíl skriptu, ve kterém chcete, aby PowerShell monitoroval chyby. Pokud dojde k chybě v try rámci bloku, chyba se nejprve uloží do $Error automatické proměnné. PowerShell pak vyhledá catch blok pro zpracování chyby. try Pokud příkaz nemá odpovídající catch blok, PowerShell bude dál hledat odpovídající catch blok nebo Trap příkaz v nadřazených oborech. catch Po dokončení bloku nebo v případě, že se nenajde žádný odpovídající catch blok nebo Trap příkaz, finally se blok spustí. Pokud chybu nelze zpracovat, chyba se zapíše do datového proudu chyb.

catch Blok může obsahovat příkazy pro sledování chyby nebo obnovení očekávaného toku skriptu. Blok catch může určit, které typy chyb zachytí. Příkaz try může obsahovat několik catch bloků pro různé druhy chyb.

Blok finally lze použít k uvolnění všech prostředků, které už váš skript nepotřebuje.

try, catcha finally podobají se jazyku try, catcha finally klíčovým slovům používaným v programovacím jazyce C#.

Syntaxe

Příkaz try obsahuje try blok, nula nebo více catch bloků a nula nebo jeden finally blok. Příkaz try musí mít alespoň jeden catch blok nebo jeden finally blok.

Následující příklad ukazuje try syntaxi bloku:

try {<statement list>}

Za try klíčovým slovem následuje seznam příkazů ve složených závorkách. Pokud při spuštění příkazů v seznamu příkazů dojde k ukončovací chybě, skript předá objekt chyby z try bloku do příslušného catch bloku.

Následující příklad ukazuje catch syntaxi bloku:

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

Typy chyb se zobrazují v hranatých závorkách. Vnější závorky označují, že prvek je volitelný.

Za catch klíčovým slovem následuje volitelný seznam specifikací typu chyby a seznam příkazů. Pokud dojde k ukončovací chybě v try bloku, PowerShell vyhledá příslušný catch blok. Pokud se jeden najde, příkazy v catch bloku se spustí.

Blok catch může zadat jeden nebo více typů chyb. Typ chyby je výjimka rozhraní Microsoft .NET Framework nebo výjimka odvozená z výjimky rozhraní .NET Framework. Blok catch zpracovává chyby zadané třídy výjimek rozhraní .NET Framework nebo jakékoli třídy odvozené ze zadané třídy.

catch Pokud blok určuje typ chyby, catch tento blok zpracovává tento typ chyby. catch Pokud blok nezadá typ chyby, catch tento blok zpracovává všechny chyby, ke kterým došlo v try bloku. Příkaz try může obsahovat více catch bloků pro různé zadané typy chyb.

Následující příklad ukazuje finally syntaxi bloku:

finally {<statement list>}

Za finally klíčovým slovem následuje seznam příkazů, který se spustí při každém spuštění skriptu, a to i v případě, že příkaz try běžel bez chyby nebo byla v catch příkazu zachycena chyba.

Všimněte si, že stisknutím kombinace kláves CTRL+C se kanál zastaví. Objekty odeslané do kanálu se nezobrazí jako výstup. Proto pokud zahrnete příkaz, který se má zobrazit, například "Finally block has run", nezobrazí se po stisknutí kombinace kláves CTRL+C, i když finally se blok spustil.

Zachytávání chyb

Následující ukázkový skript ukazuje try blok s blokem catch :

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

Klíčové catch slovo musí okamžitě následovat za blokem try nebo jiným blokem catch .

PowerShell nerozpozná "NesmyslyString" jako rutinu nebo jinou položku. Spuštění tohoto skriptu vrátí následující výsledek:

An error occurred.

Když skript narazí na "NesmyslyString", způsobí ukončující chybu. Blok catch zpracovává chybu spuštěním seznamu příkazů uvnitř bloku.

Použití více příkazů catch

Příkaz try může mít libovolný počet catch bloků. Například následující skript obsahuje try blok, který stáhne MyDoc.doc, a obsahuje dva catch bloky:

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."
}

První catch blok zpracovává chyby typů System.Net.WebException a System.IO.IOException . Druhý catch blok nezadá typ chyby. Druhý catch blok zpracovává všechny ostatní ukončující chyby, ke kterým dochází.

PowerShell odpovídá typům chyb podle dědičnosti. Blok catch zpracovává chyby zadané třídy výjimek rozhraní .NET Framework nebo jakékoli třídy odvozené ze zadané třídy. Následující příklad obsahuje catch blok, který zachytí chybu "Command Not Found":

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

Zadaný typ chyby CommandNotFoundException dědí z typu System.SystemException . Následující příklad také zachytí chybu Příkaz Nenalezena:

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

Tento catch blok zpracovává chybu Command Not Found a další chyby, které dědí z typu SystemException .

Pokud zadáte chybovou třídu a jednu z jejích odvozených tříd, umístěte catch blok odvozené třídy před catch blok pro obecnou třídu.

Poznámka:

PowerShell zabalí všechny výjimky v typu RuntimeException . Proto se určení typu chyby System.Management.Automation.RuntimeException chová stejně jako nekvalifikovaný blok catch.

Použití soutisků v try catch

Pokud dojde k ukončovací chybě v try bloku s definovaným Trap v try rámci bloku, i když existuje odpovídající catch blok, Trap příkaz převezme kontrolu.

Pokud existuje v Trap vyšším bloku než trya v aktuálním oboru neexistuje žádný odpovídající catch blok, Trap převezme řízení, a to i v případě, že některý nadřazený obor má odpovídající catch blok.

Přístup k informacím o výjimce

catch V rámci bloku lze k aktuální chybě přistupovat pomocí $_, což se označuje také jako $PSItem. Objekt je typu ErrorRecord.

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

Spuštění tohoto skriptu vrátí následující výsledek:

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.

Existují další vlastnosti, ke kterým lze přistupovat, například ScriptStackTrace, Exception a ErrorDetails. Pokud například změníme skript na následující:

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

Výsledek bude podobný následujícímu:

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

Uvolnění prostředků pomocí funkce Finally

Pokud chcete uvolnit prostředky používané skriptem, přidejte finally za blok try a catch bloky blok. Příkazy finally bloku se spouštějí bez ohledu na to, jestli try se blok setká s ukončovací chybou. PowerShell spustí finally blok před ukončením skriptu nebo před ukončením aktuálního bloku mimo rozsah.

finally Blok se spustí i v případě, že k zastavení skriptu použijete ctrl+C. finally Blok se také spustí, pokud klíčové slovo Exit zastaví skript v rámci catch bloku.

Viz také