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č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
trapa 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
ifnebo smyčkaforeach, příkazy v blokutrapse 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í
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.
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.