Zpracování chyb

Dokončeno

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-CatchTrap. 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žijete Try 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. A Try musí mít aspoň jeden Catch nebo Finally 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ásleduje Catch bezprostředně za .Try Pokud chcete, můžete zahrnout více než jednu Catch – 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á zachytit Try/Catchtakto:

    Try {
       Get-Content './file.txt' -ErrorAction Stop
    } Catch {
       Write-Error "File can't be found"
    }
    

    Pomocí parametru -ErrorAction a hodnoty Stopmůž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.