Sdílet prostřednictvím


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.

Viz také

about_Break

about_Continue

about_Scopes

about_Throw

about_Try_Catch_Finally