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é 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 nezpracovává ukončující chybu, PowerShell také zastaví spuštění funkce nebo skriptu v aktuálním kanálu. V jiných jazycích, jako je C # , ukončující chyby se označují jako výjimky.
TrapKlíčové slovo určuje seznam příkazů, které se mají spustit, když dojde k ukončující chybě. Příkazy depeše zpracovávají ukončující chyby a umožňují provádění skriptu nebo funkce k pokračování místo zastavení.
Příkazy depeše můžou být také složitější. Seznam příkazů depeše může zahrnovat několik podmínek nebo volání funkcí. Depeše může zapisovat protokoly, podmínky testování nebo dokonce spustit jiný program.
Syntax
Příkaz depeše má následující syntaxi:
trap [[<error type>]] {<statement list>}
Příkaz depeše obsahuje seznam příkazů, které se mají spustit, když dojde k ukončující chybě. Příkaz depeše se skládá z trap klíčového slova, volitelně následovaný výrazem typu, a bloku příkazu, který obsahuje seznam příkazů, které se mají spustit, když je chyba zachycena. Výraz typu dohodnotí typy chyb, které zachycuje depeše.
Skript nebo příkaz může obsahovat více příkazů depeše. Příkazy depeše se můžou objevit kdekoli ve skriptu nebo příkazu.
Vytváření přesahů všech ukončujících chyb
Pokud dojde k ukončující chybě, která se ve skriptu nebo příkazu nezpracovává jiným způsobem, PowerShell zkontroluje příkaz depeše, který zpracovává chybu. Pokud je přítomen příkaz depeše, PowerShell pokračuje v běhu skriptu nebo příkazu v příkazu depeše.
V následujícím příkladu je výraz jednoduché depeše:
trap {"Error found."}
Tento příkaz depeše zachytávání všech ukončujících chyb.
V následujícím příkladu funkce zahrnuje nonsense řetězec, který způsobí chybu za běhu.
function TrapTest {
trap {"Error found."}
nonsenseString
}
TrapTest
Spuštění této funkce vrátí následující:
Error found.
Následující příklad obsahuje příkaz depeše, 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í:
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 then try
again.
Důležité
Příkazy depeše mohou být definovány kdekoli v daném oboru, ale vždy platí pro všechny příkazy v tomto oboru. V době běhu jsou depeše v bloku definovány před spuštěním jakýchkoli jiných příkazů. V jazyce JavaScript se označuje jako zdvihací. To znamená, že depeše platí pro všechny příkazy v bloku, a to i v případě, že provedení nepokročilo od bodu, ve kterém jsou definovány. Například definování depeše na konci skriptu a při vyvolání chyby v prvním příkazu bude stále aktivována tato depeše.
Vytváření přesahů specifických chyb
Skript nebo příkaz může obsahovat více příkazů depeše. Depeše lze definovat pro zpracování specifických chyb.
Následující příklad je příkaz depeše, který zachytávání konkrétní chyby CommandNotFoundException:
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
V případě, že funkce nebo skript narazí na řetězec, který neodpovídá známému příkazu, zobrazí tento příkaz depeše řetězec "zachytávání chyb příkazu". Po spuštění Trap seznamu příkazů PowerShell zapíše objekt Error do datového proudu chyb a pak pokračuje ve skriptu.
Prostředí PowerShell používá typy výjimek od společnosti Microsoft .NET Framework. 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 provede depeši chyby, která je vytvořena neznámým příkazem. Také provádí soutisk jiných typů chyb.
Ve skriptu můžete mít více než jeden příkaz depeše. Každý typ chyby může být zachycen pouze jedním příkazem depeše. Když dojde k ukončující chybě, PowerShell vyhledá depeši s nejpřesnější shodou, počínaje aktuálním rozsahem provádění.
Následující příklad skriptu obsahuje chybu. Skript obsahuje obecný příkaz depeše, který zachytává 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í tohoto skriptu vytvoří následující výsledek:
Command error trapped
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.
At C:\temp\test\traptest.ps1:5 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonsenseString:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Protože prostředí PowerShell nerozpozná "nonsenseString" jako rutinu nebo jinou položku, vrátí chybu CommandNotFoundException . Tato ukončující chyba je zachycena konkrétním příkazem depeše.
Následující příklad skriptu obsahuje stejné příkazy depeše s odlišnou chybou:
trap {"Other terminating error trapped" }
trap [System.Management.Automation.CommandNotFoundException]
{"Command error trapped"}
1/$null
Spuštění tohoto skriptu vytvoří následující výsledek:
Other terminating error trapped
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Při pokusu o dělení nulou se nevytvoří Chyba CommandNotFoundException . Místo toho je tato chyba zachycena jiným příkazem depeše, který provede zachycení jakékoli ukončující chyby.
Vytváření přesahů chyb a rozsahu
Pokud dojde k ukončující chybě ve stejném oboru jako příkaz depeše, PowerShell spustí seznam příkazů definovaných depeší. Provádění pokračuje na příkazu po chybě. Pokud je příkaz depeše v jiném oboru než chyba, provádění pokračuje u dalšího příkazu, který je ve stejném oboru jako příkaz depeše.
Například pokud ve funkci dojde k chybě a příkaz depeše je ve funkci, skript pokračuje v dalším příkazu. Následující skript obsahuje chybu a příkaz depeše:
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
Později ve skriptu spustí funkce Function1 následující výsledek:
function1
An error:
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
then try again.
At C:\PS>TestScript1.ps1:3 char:19
+ NonsenseString <<<<
function1 was completed
V příkazu Paste ve funkci je chyba. Po zobrazení zprávy PowerShell obnoví běh funkce. Všimněte si, že Function1 se dokončilo.
Porovnejte to s následujícím příkladem, který má stejnou chybu a Trap příkaz. V tomto příkladu se k příkazu depeše nachází mimo funkci:
function function2 {
NonsenseString
"function2 was completed"
}
trap { "An error: " }
function2
Spuštění Function2 funkce vytvoří následující výsledek:
An error:
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
then try again.
At C:\PS>TestScript2.ps1:4 char:19
+ NonsenseString <<<<
V tomto příkladu nebyl spuštěn příkaz "function2 byl dokončen". V obou příkladech dojde k ukončující chybě v rámci funkce. V tomto příkladu je však příkaz depeše mimo funkci. Po spuštění příkazu depeše se PowerShell nevrátí do funkce.
Upozornění
Pokud je pro stejný chybový stav definováno více depeší, použije se první zachycená depeše (nejvyšší v oboru).
V následujícím příkladu je spuštěna pouze depeše s názvem "Whoops 1".
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
Pomocí break continue klíčových slov a
Pomocí Break Continue klíčových slov a v příkazu depeše můžete určit, zda bude skript nebo příkaz nadále spuštěn po ukončení chyby.
Pokud zahrnete Break příkaz do seznamu příkazů depeše, PowerShell zastaví funkci nebo skript. Následující ukázková funkce používá Break klíčové slovo v příkazu depeše:
function break_example {
trap {
"Error trapped"
break
}
1/$null
"Function completed."
}
break_example
Error trapped
Attempted to divide by zero.
At line:4 char:7
Vzhledem k tomu, že příkaz přesahu zahrnoval Break klíčové slovo, funkce nepokračuje v běhu a řádek "funkce je dokončen" se nespustí.
Pokud zahrnete Continue příkaz do příkazu depeše, prostředí PowerShell pokračuje po příkazu, který způsobil chybu, stejně jako bez Break nebo Continue . Pomocí Continue klíčového slova ale prostředí PowerShell nepíše chybu do datového proudu chyb.
Následující ukázková funkce používá Continue klíčové slovo v Trap příkazu:
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
Funkce pokračuje po zachycení k chybě a spustí se příkaz "dokončeno funkce". Do datového proudu chyb se nezapisuje žádná chyba.
Poznámky
Příkazy depeše poskytují jednoduchý způsob, jak široce zajistit všechny ukončující chyby v rámci oboru. Pro lepší zpracování chyb používejte try / catch bloky, kde jsou depeše definovány pomocí Catch příkazů. CatchPříkazy se vztahují pouze na kód uvnitř asociovaného Try příkazu. Další informace najdete v tématu about_Try_Catch_Finally.