Zpracování chyb
Zatím jste viděli, jak přidání parametrů a konstruktorů řízení toku může zajistit flexibilní a bezpečnější použití skriptů. Někdy se ale ve skriptech zobrazí chyby. Potřebujete způsob, jak tyto chyby zpracovat.
Tady je několik faktorů, které je potřeba vzít v úvahu:
Postup zpracování chyby Někdy se zobrazí chyby, ze které můžete obnovit, a někdy je lepší skript zastavit. Je důležité přemýšlet o typech chyb, ke kterým může dojít, a o tom, jak je nejlépe spravovat.
Jak závažná je chyba. Existují různé druhy chybových zpráv. Některé jsou spíše jako upozornění pro uživatele, že něco není v pořádku. Některé jsou vážnější a uživatel opravdu potřebuje věnovat pozornost. Váš přístup pro zpracování chyb závisí na typu chyby. Přístup může být cokoli od prezentování zprávy až po zvýšení úrovně závažnosti a potenciálně zastavení skriptu.
Chyby
Například rutina nebo funkce můžou generovat mnoho typů chyb. Doporučujeme napsat kód pro správu jednotlivých typů chyb, ke kterým může dojít, a že je spravujete odpovídajícím způsobem s daným typem. Řekněme například, že se pokoušíte zapisovat do souboru. V závislosti na tom, co je špatně, se můžou zobrazit různé typy chyb. Pokud do souboru nemůžete zapisovat, může se zobrazit jeden typ chyby. Pokud soubor neexistuje, může se zobrazit jiný typ chyby atd.
Při spuštění PowerShellu můžete získat dva typy chyb:
Ukončující chyba. Chyba tohoto typu zastaví provádění na řádku, kde došlo k chybě. Tento druh chyby můžete zpracovat pomocí nebo
Try-Catch
Trap
. Pokud se chyba nezpracuje, skript se v tomto okamžiku ukončí a nespustí se žádné příkazy.Poznámka:
Konstrukce
Trap
je mimo rozsah tohoto modulu. Pokud vás zajímá, podívejte se na téma O pasti.Neukončující chyba Tento typ chyby upozorní uživatele, že něco není v pořádku, ale skript bude pokračovat. Tento typ chyby můžete upgradovat na ukončující chybu.
Správa chyb pomocí Try/Catch/Finally
Koncovou chybu si můžete představit jako neočekávanou chybu. Tyto chyby jsou závažné. Při řešení jedné z nich byste měli zvážit, o jaký typ chyby se jedná a co s tím dělat.
Existují tři související konstrukce, které vám můžou pomoct se správou tohoto typu chyby:
Try
. Blok použijeteTry
k zapouzdření jednoho nebo více příkazů. Kód, který chcete spustit , například kód, který zapisuje do zdroje dat, umístíte do složených závorek. ATry
musí mít aspoň jedenCatch
neboFinally
blok. Takto vypadá:Try { # Statement. For example, call a command. # Another statement. For example, assign a variable. }
Catch
. Toto klíčové slovo použijete k zachycení nebo správě chyby, když k ní dojde. Pak zkontrolujete objekt výjimky, abyste pochopili, k jakému typu chyby došlo, kde došlo, a jestli se skript může obnovit. NásledujeCatch
bezprostředně za .Try
Pokud chcete, můžete zahrnout více než jednuCatch
– jednu pro každý typ chyby. Tady je příklad:Try { # Do something with a file. } Catch [System.IO.IOException] { Write-Host "Something went wrong" } Catch { # Catch all. It's not an IOException but something else. }
Skript se pokusí spustit příkaz, který provede některé vstupně-výstupní operace. První
Catch
zachytí určitý typ chyby:[System.IO.IOException]
. PosledníCatch
zachytí nic, co není[System.IO.IOException]
.Finally
. Příkazy v tomto bloku se spustí bez ohledu na to, jestli se něco nepovede. Tento blok pravděpodobně nebudete moc používat, ale může být užitečné například pro vyčištění prostředků. Pokud ho chcete použít, přidejte ho jako poslední blok:Try { # Do something with a file. } Catch [System.IO.IOException] { Write-Host "Something went wrong" } Catch { # Catch all. It's not an IOException but something else. } Finally { # Clean up resources. }
Kontrola chyb
Mluvili jsme o objektech výjimek v kontextu zachycení chyb. Tyto objekty můžete použít ke kontrole toho, co se nepovedlo, a přijmout příslušná opatření. Objekt výjimky obsahuje:
Zpráva. Zpráva vám řekne několik slov, co se nepovedlo.
Stopa zásobníku. Trasování zásobníku vám řekne, které příkazy se spustily před chybou. Představte si, že máte volání funkce A, následované B a C. Skript přestane reagovat na C. Trasování zásobníku zobrazí tento řetězec volání.
Řádek, který se odsudí. Objekt výjimky také informuje, který řádek byl skript spuštěn, když došlo k chybě. Tyto informace vám můžou pomoct s laděním kódu.
Jak tedy prověříte objekt výjimky? Existuje předdefinovaná proměnná, $_
která má exception
vlastnost. Pokud chcete například zobrazit chybovou zprávu, použijte $_.exception.message
. V kódu to může vypadat takto:
Try {
# Do something with a file.
} Catch [System.IO.IOException] {
Write-Host "Something IO went wrong: $($_.exception.message)"
} Catch {
Write-Host "Something else went wrong: $($_.exception.message)"
}
Vyvolávání chyb
V některých situacích můžete chtít způsobit chybu:
Neukončující chyby V případě tohoto typu chyby vás PowerShell jenom upozorní, že se něco nepovedlo, například pomocí rutiny
Write-Error
. Skript se bude dál spouštět. To nemusí být chování, které chcete. Pokud chcete zvýšit závažnost chyby, můžete použít parametr, jako-ErrorAction
je například způsobit chybu, která se dá zachytitTry/Catch
takto:Try { Get-Content './file.txt' -ErrorAction Stop } Catch { Write-Error "File can't be found" }
Pomocí parametru
-ErrorAction
a hodnotyStop
můžete způsobit chybu, kteráTry/Catch
se může zachytit.Obchodní pravidla. Můžete mít situaci, kdy kód ve skutečnosti přestane reagovat, ale chcete, aby z obchodních důvodů. Představte si, že sanitizujete vstup a zkontrolujete, jestli je parametr cestou. Obchodní požadavek může určovat, že jsou povoleny pouze určité cesty nebo cesta musí vypadat určitým způsobem. Pokud kontroly selžou, je vhodné vyvolat chybu. V takové situaci můžete použít
Throw
blok:Try { If ($Path -eq './forbidden') { Throw "Path not allowed" } # Carry on. } Catch { Write-Error "$($_.exception.message)" # Path not allowed. }
Poznámka:
Obecně platí, že se nepoužívá
Throw
k ověřování parametrů. Místo toho použijte ověřovací atributy . Pokud nemůžete kód s těmito atributy pracovat,Throw
může to být v pořádku.