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 neboforeach
smyčka, příkazy vtrap
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
vtrap
příkazu.Umlčte chybu, ale pokračujte v provádění skriptu nebo funkce, která obsahuje
trap
příkaz usingcontinue
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.