Sdílet prostřednictvím


about_Trap

Krátký popis

Popisuje klíčové slovo, které zpracovává 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é trap slovo určuje seznam příkazů, které se mají spustit, když dojde k ukončovací chybě. trap příkazy můžou zpracovávat ukončovací chyby následujícími způsoby:

  • Zobrazí chybu po zpracování trap bloku příkazu 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 if je příkaz nebo foreach smyčka, příkazy v trap bloku 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 použití break v trap příkazu.

  • Umlčte chybu, ale pokračujte v provádění skriptu nebo funkce, která obsahuje trap příkaz using continue trap .

Seznam trap příkazů může obsahovat více podmínek nebo volání funkcí. Může trap 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 trap slova, volitelně následovaného výrazem typu, a blok příkazu obsahující seznam příkazů, které se mají spustit při zachycení chyby. Výraz typu zpřesňuje typy chyb, které zachytává trap .

Skript nebo příkaz můžou mít více trap příkazů. trap příkazy se můžou 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ý zpracovává chybu. trap Pokud je příkaz k dispozici, PowerShell pokračuje ve spuštění skriptu nebo příkazu v trap příkazu.

Následující příklad je minimální trap příkaz:

trap { 'Error found.' }

Tento trap příkaz vystihová všechny ukončující chyby.

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 trap příkaz, který zobrazí 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. V době běhu trap se příkazy v bloku definují před provedením dalších příkazů. V JavaScriptu se to označuje jako nahození. To znamená, že trap příkazy se vztahují na všechny příkazy v tomto bloku, i když provádění nepokročilo po bodu, ve kterém jsou definované. Například definování na trap konci skriptu a vyvolání chyby v prvním příkazu stále aktivuje, že trap.

Zachycení konkrétních chyb

Skript nebo příkaz můžou mít více trap příkazů. Je možné definovat A trap pro zpracování konkrétních chyb.

Následující příklad je trap příkaz, 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í Command error trapped tento trap příkaz řetězec. Po spuštění trap seznamu příkazů 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 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 příkazů trap . Každý typ chyby může vystihot pouze jeden trap příkaz. Pokud dojde k ukončovací chybě, PowerShell vyhledá trap nejkonkrétnější shodu počínaje aktuálním blokem spuštění skriptu.

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

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í trap příkaz zachytí tuto ukončující chybu.

Následující příklad skriptu obsahuje stejné trap příkazy 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.

Při pokusu o dělení nulou se nevytvoří chyba CommandNotFoundException . Druhý trap příkaz, který vychytává všechny ukončující chyby, odchytí dělicí nulou chybu.

Chyby zachycení v bloku skriptu

Ve výchozím nastavení se při ukončení chyby provádění přenese do příkazu trap. trap Po spuštění bloku se ovládací prvek vrátí do dalšího bloku příkazu za umístěním chyby.

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

trap { 'An error occurred!'}
foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
}
'after loop'
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
An error occurred!
RuntimeException:
Line |
   4 |         "`t$(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 foreach bloku skriptu, spustí try příkaz a pokračuje po foreach bloku skriptu.

Chyby a rozsah zachytávání

Pokud dojde k ukončovací chybě ve stejném bloku skriptu jako příkaz trap , PowerShell spustí seznam příkazů definovaných příkazy trap. Spuštění pokračuje v příkazu po chybě. trap Pokud je příkaz v jiném bloku skriptu od chyby, provádění pokračuje v dalším příkazu, který je ve stejném bloku skriptu jako příkaztrap.

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

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 vystihuje chybu. Po zobrazení zprávy PowerShell obnoví spuštění funkce. Všimněte si, že Function1 se trap dokončilo po příkazu.

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

function function2 {
    NonsenseString
    'function2 was completed'
}

trap { 'An error:' }

function2

Function2 Spuštění funkce 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 function2 was completed se příkaz nespustí. V oboupříkladch V tomto příkladu trap je však příkaz mimo funkci. Po spuštění příkazu se PowerShell nevrátí do funkce trap .

Upozornění

Pokud je pro stejnou chybovou podmínku definováno více soutisků, použije se první trap definovaný lexikální (nejvyšší v bloku skriptu).

V následujícím příkladu platí pouze spuštěnítrap.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 trap příkaz uvnitř funkce nebo tečkovaného skriptu, při ukončení funkce nebo tečkovaného skriptu se odeberou všechny trap příkazy uvnitř.

Použití přerušení a pokračování klíčových slov

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

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

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 break klíčové slovo, funkce neběží dál a Function completed řádek se nespustí.

Pokud do příkazu zahrnete continue klíčové slovo, PowerShell se obnoví za příkazem, který chybu způsobil, stejně jako bez break něj nebo continue.trap S klíčovým slovem continue ale PowerShell nezapíše chybu do datového proudu chyb.

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

function ContinueExample {
    trap {
        'Error trapped'
        continue
    }
    foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
    }
    'End of function'
}

ContinueExample
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
Error trapped
End of function

Funkce se obnoví po zachycení chyby a příkaz End of function se spustí. Do datového proudu chyb se nezapisuje žádná chyba.

Notes

trap příkazy poskytují způsob, jak zajistit, aby se všechny ukončující chyby v bloku skriptu zpracovávaly. Pro jemněji odstupňované zpracování chyb použijte try/catch bloky, ve kterých jsou depeše definovány příkazy using.catch Příkazy catch se vztahují pouze na kód uvnitř přidruženého try příkazu. Další informace najdete v tématu about_Try_Catch_Finally.

Viz také