Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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
trapa 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 příkazu, jako
ifje příkaz neboforeachsmyčka, příkazy vtrapbloku se spustí a provádění pokračuje na dalším příkazu mimo podřízený blok.Zobrazí chybu a přeruší spuštění skriptu nebo funkce obsahující
trappomocíbreakv příkazutrap.Umlčte chybu, ale pokračujte v provádění skriptu nebo funkce obsahující
trappomocícontinuev příkazutrap.
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.
Syntax
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 trap příkaz, který zobrazuje chybu pomocí $_ proměnné nebo $PSItem 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 lze definovat kdekoli v rámci daného bloku skriptu, ale vždy platí pro všechny příkazy v daném scriptblocku. Za běhu jsou příkazy trap v bloku definovány před provedením jiných příkazů.
V jinýchch 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 nejvýkonnější shodu 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.
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. Poté, co se spustí blok trap, se řízení vrátí k dalšímu bloku příkazů za místem 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 příkazu, spustí try příkaz a pokračuje za příkazem 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 příkazy trap. Provedení pokračuje na příkazu následujícím 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 skriptublock jako příkaztrap.
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.
Opatrnost
Pokud je pro stejnou chybovou podmínku definováno více soutisků, použije se první trap definovaný lexicky (nejvyšší 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 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 spustí se příkaz End of function. 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 rámci bloku skriptu. Pro jemněji odstupňované zpracování chyb použijte try/catch bloky, kde jsou depeše definovány příkazy using 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.