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čující chybu, PowerShell také přestane spouštět funkci nebo skript 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 chování je výchozí.

    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 vyhledá příkaz trap, který tuto 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 minimální příkaz trap:

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í výstup:

Error found.
nonsenseString:
Line |
   3 |      nonsenseString
     |      ~~~~~~~~~~~~~~
     | The term 'nonsenseString' is not recognized as a name of a cmdlet,
function, script file, or executable 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í výstup:

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 a name of a cmdlet,
function, script file, or executable 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 bloku skriptu, ale vždy platí pro všechny příkazy v daném bloku skriptu. 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 trap příkazy platí pro všechny příkazy v tomto bloku, i když provádění nepokročilo za 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'
}

Pokud funkce nebo skript narazí na řetězec, který neodpovídá známému příkazu, zobrazí tento příkaz trap řetězec Command error trapped. 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í všechny chyby vyvolané neznámými příkazy. Vychytává také jiné typy chyb.

Typ výjimky pro chybu najdete kontrolou objektu chyby. Následující příklad ukazuje, jak získat úplný název výjimky týkající se poslední chyby v relaci:

nonsenseString
$Error[0].Exception.GetType().FullName
nonsenseString: The term 'nonsenseString' is not recognized as a name of a
cmdlet, function, script file, or executable program. Check the spelling
of the name, or if a path was included, verify that the path is correct
and try again.

System.Management.Automation.CommandNotFoundException

Ve skriptu můžete mít více než jeden příkaz trap. Pouze jeden příkaz trap může zachytit každého typu chyby. Když dojde k ukončovací chybě, PowerShell vyhledá trap s nejkonkrétnější shodou počínaje aktuálním blokem spuštění skriptu.

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 a name of a cmdlet,
function, script file, or executable 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. Konkrétní příkaz trap tuto ukončovací chybu zachytí.

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 |
   5 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

Pokus o dělení nulou nevytvoří chybu CommandNotFoundException. Druhý příkaz trap, který odchytává všechny ukončující chyby, odchytí chybu dělení nulou.

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:
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.
after loop

Ve výstupu uvidíte, že smyčky budou pokračovat až do poslední iterace. Když se skript pokusí vydělit 1 o 0, PowerShell vyvolá ukončující chybu. Skript přeskočí zbytek bloku skriptu foreach, spustí příkaz try a pokračuje po bloku skriptu foreach.

Zachytávání chyb a jejich rozsah

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

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 a name of a cmdlet,
function, script file, or executable 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 byla dokončena po příkazu trap.

Porovnejte toto chování 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 a name of a cmdlet,
function, script file, or executable 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 se příkaz function2 was completed nespustí. V obou příkladech se terminující chyba vyskytuje uvnitř funkce. V tomto příkladu je však příkaz trap mimo funkci. Po spuštění příkazu trap se PowerShell nevrátí do funkce.

Upozornění

Pokud je pro stejný chybový stav definováno více záchytů, použije se první lexikálně definovaná trap (nejvýše v bloku skriptu).

V následujícím příkladu se spustí pouze trap s 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.

Vzhledem k tomu, že příkaz trap obsahoval klíčové slovo break, funkce neběží dál a Function completed řádek se nespustí.

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 chybového proudu.

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 Function completed. Do datového proudu chyb se nezapisuje žádná chyba.

Poznámky

trap příkazy poskytují způsob, jak zajistit, aby se zpracovávaly všechny ukončovací chyby v bloku skriptu. 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é