O soutisku
Stručný 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, zastaví také spuštění funkce nebo skriptu v aktuálním kanálu. V jiných jazycích, jako je například 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čující chybě. Příkazy trapu zpracovávají ukončující chyby a umožňují pokračovat v provádění skriptu nebo funkce místo zastavení.
Příkazy soutisku můžou být také složitější. Seznam příkazů soutisku může obsahovat více podmínek nebo volání funkcí. Depeše může zapisovat protokoly, testovat podmínky nebo dokonce spustit 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čující chybě. Příkaz Trap se skládá z klíčového trap
slova, za kterým může následovat výraz typu, a bloku příkazů obsahujícího seznam příkazů, které se mají spustit při zachycení chyby. Výraz typu upřesní typy chyb, které zachytí soutisk.
Skript nebo příkaz může obsahovat více příkazů trapu. Příkazy soutisku se můžou zobrazit kdekoli ve skriptu nebo příkazu.
Zachytávání všech ukončující chyby
Když dojde k ukončující chybě, která není zpracována jiným způsobem ve skriptu nebo příkazu, PowerShell zkontroluje 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 velmi jednoduchý příkaz Trap:
trap {"Error found."}
Tento příkaz Trap vychytá 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í:
Error found.
Následující příklad obsahuje příkaz Trap, 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 trapu mohou být definovány kdekoli v daném oboru, ale vždy platí pro všechny příkazy v daném oboru. Za běhu jsou depeše v bloku definovány před spuštěním všech dalších příkazů. V JavaScriptu se to označuje jako zdvihání. To znamená, že depeše platí pro všechny příkazy v daném bloku i v případě, že provádění nepokročilo za bod, ve kterém jsou definovány. Například definování soutisku na konci skriptu a vyvolání chyby v prvním příkazu stále aktivuje tuto soutisk.
Zachytávání konkrétních chyb
Skript nebo příkaz může obsahovat více příkazů trapu. Depeše je možné definovat tak, aby zpracovávaly konkrétní chyby.
Následující příklad je příkaz Trap, který vyvolá 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, tento příkaz Trap zobrazí řetězec "Chyba příkazu zachycena". Po spuštění Trap
seznamu příkazů Zapíše PowerShell objekt chyby do datového proudu chyb a pak pokračuje ve skriptu.
PowerShell používá typy výjimek rozhraní 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 vyvolá výjimku vytvořenou neznámým příkazem. Kromě toho dochází k zachycení dalších typů 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 příkazem Trap. Když dojde k ukončující chybě, PowerShell vyhledá soutisk s nejkonspektnější shodou, a to počínaje aktuálním oborem provádění.
Následující příklad skriptu obsahuje chybu. Skript obsahuje obecný příkaz Trap, který vyvolá všechny ukončující chyby, a konkrétní Trap
příkaz, který určuje CommandNotFoundException typ.
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
Vzhledem k tomu, že PowerShell nerozpozná "nesmyslnýstring" jako rutinu nebo jinou položku, vrátí chybu CommandNotFoundException . Tato ukončující chyba je zachycena konkrétním příkazem Trap.
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í 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
Pokus o dělení nulou nevytvoří chybu CommandNotFoundException . Místo toho je tato chyba zachycena jiným příkazem Trap, který zachytí všechny ukončující chyby.
Zachytávání chyb a rozsah
Pokud dojde k ukončující chybě ve stejném oboru jako příkaz Trap, PowerShell spustí seznam příkazů definovaných pomocí depeše. Provádění pokračuje příkazem po chybě. Pokud je příkaz Trap v jiném rozsahu než chyba, provádění pokračuje dalším příkazem, který je ve stejném rozsahu jako příkaz Trap.
Pokud například dojde k chybě ve funkci a příkaz Trap je ve funkci, skript pokračuje dalším příkazem. Následující skript obsahuje chybu a příkaz trap:
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
Později ve skriptu spuštění funkce Function1 vygeneruje 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
Příkaz Trap ve funkci soutiskuje chybu. Po zobrazení zprávy Bude PowerShell pokračovat ve spouštění funkce. Všimněte si, že Function1
se dokončilo.
Porovnejte to s následujícím příkladem, který obsahuje 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:
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 se nespustí příkaz function2 was completed (funkce2 byla dokončena). V obou příkladech dochází v rámci funkce k ukončující chybě. V tomto příkladu je však příkaz Trap mimo funkci . PowerShell se po spuštění příkazu Trap nevrátí zpět do funkce.
Upozornění
Pokud je pro stejnou chybovou podmínku definováno více soutisků, použije se první lexicky definovaná soutisk (nejvyšší v oboru).
V následujícím příkladu se spustí pouze depeše s "whoops 1".
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
break
Použití klíčových slov a continue
Klíčová slova a Continue
v příkazu Trap můžete použít Break
k určení, jestli skript nebo příkaz po ukončení chyby poběží dál.
Pokud do seznamu příkazů trapu Break
zahrnete příkaz, PowerShell funkci nebo skript zastaví. Následující ukázková funkce používá Break
klíčové slovo v příkazu Trap:
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 Trap obsahuje Break
klíčové slovo , funkce nebude pokračovat ve spuštění a řádek "Funkce dokončena" se nespustí.
Pokud do příkazu Trap zahrnete Continue
příkaz, PowerShell se obnoví po příkazu, který chybu způsobil, stejně jako bez Break
příkazu nebo Continue
. 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 continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
Funkce se obnoví po zachycení chyby a spuštění příkazu "Dokončení funkce". Do datového proudu chyb se nezapíše žádná chyba.
Poznámky
Příkazy soutisků poskytují jednoduchý způsob, jak obecně zajistit, aby se všechny ukončující chyby v rámci oboru zpracovaly. Pokud chcete zpracovávat chyby jemněji, použijte try
/catch
bloky, kde se depeše definují pomocí Catch
příkazů. 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.