about_Try_Catch_Finally
Krátký popis
Popisuje, jak používat try
, catch
a finally
bloky ke zpracování ukončovací chyby.
Dlouhý popis
Funkce try
, catch
a 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
, catch
a finally
podobají se jazyku try
, catch
a 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ž try
a 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.
V následujícím příkladu se blok try
pokusí stáhnout soubor do složky c:\temp
.
catch
blokuje zpracování chyb, ke kterým dochází během stahování. Blok finally
odstraní objekt WebClient
a odebere dočasný soubor, pokud existuje.
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 }
}