Sdílet prostřednictvím


about_Trap

Krátký popis

Popisuje klíčové slovo, které řeší ukončující chybu.

Dlouhý popis

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

Klíčové slovo trap určuje seznam příkazů, které se mají spustit, když dojde k ukončovací chybě. trap příkazy můžou zacházet s ukončovacími chybami následujícími způsoby:

  • Zobrazí se chyba po zpracování bloku příkazu trap a pokračování v provádění skriptu nebo funkce obsahující trap. Toto je výchozí chování.

    Poznámka:

    Pokud dojde k ukončovací chybě v bloku podřízeného skriptu, jako je příkaz if nebo smyčka foreach, příkazy v bloku trap se spustí a provádění pokračuje v dalším příkazu mimo blok podřízeného skriptu.

  • Zobrazí chybu a přeruší spuštění skriptu nebo funkce obsahující trap pomocí break v příkazu trap.

  • Umlčte chybu, ale pokračujte v provádění skriptu nebo funkce obsahující trap pomocí continue v příkazu trap.

Seznam příkazů trap může obsahovat více podmínek nebo volání funkce. trap může zapisovat protokoly, testovací podmínky nebo dokonce spouštět jiný program.

Syntaxe

Příkaz trap má následující syntaxi:

trap [[<error type>]] {<statement list>}

Příkaz trap obsahuje seznam příkazů, které se mají spustit, když dojde k ukončovací chybě. Příkaz trap se skládá z klíčového slova trap, volitelně následovaného výrazem typu a bloku příkazu obsahujícího seznam příkazů, které se mají spustit při zachycení chyby. Výraz typu zpřesňuje typy chyb, které trap zachytí.

Skript nebo povel mohou mít více výroků trap. Příkazy trap se mohou objevit kdekoli ve skriptu nebo příkazu.

Zachycení všech ukončujících chyb

Pokud dojde k ukončovací chybě, která není zpracována jiným způsobem ve skriptu nebo příkazu, PowerShell zkontroluje trap příkaz, který chybu zpracuje. Pokud je k dispozici příkaz trap, PowerShell pokračuje ve spouštění skriptu nebo příkazu v příkazu trap.

Následující příklad je velmi jednoduchý trap příkaz:

trap {"Error found."}

Tento příkaz trap zachytí všechny chyby, které vedou k ukončení.

V následujícím příkladu funkce obsahuje nesmyslný řetězec, který způsobuje chybu za běhu.

function TrapTest {
    trap {"Error found."}
    nonsenseString
}

TrapTest

Spuštění této funkce vrátí následující:

Error found.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | 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.

Následující příklad obsahuje příkaz trap, který zobrazuje chybu pomocí $_ automatické proměnné:

function TrapTest {
    trap {"Error found: $_"}
    nonsenseString
}

TrapTest

Spuštění této verze funkce vrátí následující:

Error found: 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.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | 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.

Důležité

trap Příkazy mohou být definovány kdekoli v daném rozsahu, ale vždy se vztahují na všechny příkazy v daném rozsahu. Za běhu jsou příkazy trap v bloku definovány před provedením jiných příkazů. V JavaScriptu se to označuje jako zvedání . To znamená, že příkazy se vztahují na všechny příkazy v tomto bloku, trap i když provádění nepřekročilo bod, ve kterém jsou definovány. Například definování trap na konci skriptu a vyvolání chyby při prvním příkazu stále spustí trap.

Zachycení konkrétních chyb

Skript nebo povel mohou mít více výroků trap. Je možné definovat trap pro zpracování konkrétních chyb.

Následující příklad je příkaz trap, který schytí konkrétní chybu CommandNotFoundException:

trap [System.Management.Automation.CommandNotFoundException]
    {"Command error trapped"}

Když funkce nebo skript narazí na řetězec, který neodpovídá známému příkazu, zobrazí tento trap příkaz řetězec "Zachycení chyb příkazu". Po spuštění seznamu příkazů trap PowerShell zapíše objekt chyby do datového proudu chyby a pak pokračuje ve skriptu.

PowerShell používá typy výjimek .NET. Následující příklad určuje typ chyby System.Exception:

trap [System.Exception] {"An error trapped"}

Typ chyby CommandNotFoundException dědí z typu System.Exception. Tento příkaz zachytí chybu vytvořenou neznámým příkazem. Vychytává také jiné typy chyb.

Ve skriptu můžete mít více než jeden příkaz trap. Každý typ chyby může být zachycen pouze jedním trap příkazem. Když dojde k ukončující chybě, PowerShell vyhledá doménu trap s nejkonkrétnější shodou, která začíná v aktuálním rozsahu provádění.

Následující příklad skriptu obsahuje chybu. Skript obsahuje obecný příkaz trap, který vychytí všechny ukončovací chyby a konkrétní příkaz trap, který určuje CommandNotFoundException typ.

trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException] {
  "Command error trapped"
}
nonsenseString

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

Command error trapped
nonsenseString:
Line |
   5 |  nonsenseString
     |  ~~~~~~~~~~~~~~
     | 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.

Vzhledem k tomu, že PowerShell nerozpozná "nonsenseString" jako rutinu nebo jinou položku, vrátí chybu CommandNotFoundException . Tato ukončovací chyba je zachycena konkrétním trap příkazem.

Následující příklad skriptu obsahuje stejné příkazy trap s jinou chybou:

trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
    {"Command error trapped"}
1/$null

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

Other terminating error trapped
RuntimeException:
Line |
   4 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

Pokus o dělení nulou nevytvoří chybu CommandNotFoundException . Místo toho je tato chyba zachycena druhým trap příkazem, který zachytí jakoukoli ukončující chybu.

Zachytávání chyb v bloku skriptu

Ve výchozím nastavení se při ukončení chyby provádění přenese do příkazu trap. Poté, co se spustí blok trap, se řízení vrátí k dalšímu bloku příkazů za místem chyby.

Pokud například dojde k ukončovací chybě v příkazu foreach, příkaz trap se spustí a spuštění pokračuje v dalším příkazu za blokem foreach, ne v rámci bloku foreach.

trap { 'An error occurred!'}
foreach ($x in 3..0) {
   1/$x
   'after division'
}
'after loop'
0.333333333333333
after division
0.5
after division
1
after division
An error occurred!
RuntimeException: untitled:Untitled-1:3:4
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.

after loop

Ve výše uvedeném výstupu můžete vidět, že smyčky pokračují až do poslední iterace. Když se skript pokusí vydělit 1 0, je vyhozena ukončovací chyba. Zbytek foreach bloku skriptů se přeskočí, try příkaz se spustí a skript pokračuje po bloku skriptů foreach .

Zachytávání chyb a jejich rozsah

Pokud dojde k ukončovací chybě ve stejném oboru jako trap příkaz, PowerShell spustí seznam příkazů definovaných rozhraním trap. Provedení pokračuje na příkazu následujícím po chybě. trap Pokud je příkaz v jiném rozsahu než chyba, provádění pokračuje dalším příkazem, který je ve stejném rozsahu jako trap příkaz.

Pokud například ve funkci dojde k chybě a příkaz trap je ve funkci, skript pokračuje na dalším příkazu. Následující skript obsahuje chybu a příkaz trap:

function function1 {
    trap { "An error: " }
    NonsenseString
    "function1 was completed"
}

function1

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

An error:
NonsenseString:
Line |
   3 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | 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.
function1 was completed

Příkaz trap ve funkci zachytí chybu. Po zobrazení zprávy PowerShell obnoví spuštění funkce. Všimněte si, že Function1 bylo dokončeno.

Porovnejte to s následujícím příkladem, který má stejnou chybu a trap příkaz. V tomto příkladu se příkaz trap vyskytuje mimo funkci:

function function2 {
    NonsenseString
    "function2 was completed"
}

trap { "An error: " }

function2

Spuštění funkce Function2 vytvoří následující výsledek:

An error:
NonsenseString:
Line |
   2 |      NonsenseString
     |      ~~~~~~~~~~~~~~
     | 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.

V tomto příkladu nebyl spuštěn příkaz "function2 was completed". V obou příkladech se terminující chyba vyskytuje uvnitř funkce. V tomto příkladu je však příkaz trap mimo funkci. PowerShell se po trap spuštění příkazu nevrátí zpět do funkce.

Upozornění

Pokud je pro stejný chybový stav definováno více depeší, použije se první trap definovaná lexikálně (nejvyšší v oboru).

V následujícím příkladu je spuštěna pouze metoda trap with "whoops 1".

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }

Důležité

Příkaz Trap je vymezen na místo, kde se kompiluje. Pokud máte příkaz trap uvnitř funkce nebo tečkovaného skriptu, při ukončení funkce nebo tečkovaného skriptu se odeberou všechny příkazy trap uvnitř.

Použití klíčových slov break a continue

Pomocí klíčových slov break a continue v příkazu trap můžete určit, jestli se skript nebo příkaz bude dál spouštět po ukončení chyby.

Pokud do seznamu příkazů break zahrnete příkaz trap, PowerShell funkci nebo skript zastaví. Následující ukázková funkce používá klíčové slovo break v příkazu trap:

function break_example {
    trap {
        "Error trapped"
        break
    }
    1/$null
    "Function completed."
}

break_example
Error trapped
ParentContainsErrorRecordException:
Line |
   6 |      1/$null
     |      ~~~~~~~
     | Attempted to divide by zero.

Protože příkaz obsahoval trapbreak klíčové slovo, funkce nebude pokračovat v běhu a řádek "Funkce dokončena" nebude spuštěn.

Pokud zahrnete klíčové slovo continue do příkazu trap, PowerShell pokračuje za příkazem, který chybu způsobil, přesně jako by to bylo bez break nebo continue. S klíčovým slovem continue ale PowerShell nezapisuje chybu do datového proudu error.

Následující ukázková funkce používá klíčové slovo continue v příkazu trap:

function continue_example {
    trap {
        "Error trapped"
        continue
    }
    1/$null
    "Function completed."
}

continue_example
Error trapped
Function completed.

Funkce se obnoví po zachycení chyby a spustí se příkaz "Funkce dokončena". Do datového proudu chyb se nezapisuje žádná chyba.

Poznámky

trap Příkazy poskytují jednoduchý způsob, jak obecně zajistit zpracování všech ukončujících chyb v rámci oboru. Pokud chcete podrobnější zpracování chyb, použijte bloky try/catch, kde jsou pasti definovány pomocí příkazů catch. Příkazy catch se vztahují pouze na kód uvnitř přidruženého příkazu try. Další informace naleznete v tématu about_Try_Catch_Finally.

Viz také