about_Trap
Krótki opis
Opisuje słowo kluczowe, które obsługuje błąd zakończenia.
Długi opis
Błąd zakończenia uniemożliwia uruchomienie instrukcji. Jeśli program PowerShell nie obsługuje błędu zakończenia w jakiś sposób, program PowerShell również przestanie uruchamiać funkcję lub skrypt w bieżącym potoku. W innych językach, takich jak C#, błędy kończenie są nazywane wyjątkami.
Słowo trap
kluczowe określa listę instrukcji do uruchomienia po wystąpieniu błędu zakończenia. trap
instrukcje mogą obsługiwać błędy kończenie w następujący sposób:
Wyświetl błąd po przetworzeniu bloku instrukcji i kontynuowaniu
trap
wykonywania skryptu lub funkcji zawierającejtrap
. To zachowanie jest domyślne.Uwaga
Gdy błąd zakończenia występuje w bloku skryptu podrzędnego, takim jak
if
instrukcja lubforeach
pętla, instrukcje wtrap
bloku są uruchamiane i wykonywanie będzie kontynuowane w następnej instrukcji poza blokiem skryptu podrzędnego.Wyświetl błąd i przerwanie wykonywania skryptu lub funkcji zawierającej
trap
metodę usingbreak
w instrukcjitrap
.Wycisz błąd, ale kontynuuj wykonywanie skryptu lub funkcji zawierającej
trap
element przy użyciucontinue
instrukcjitrap
.
Lista instrukcji może trap
zawierać wiele warunków lub wywołań funkcji. Element trap
może zapisywać dzienniki, warunki testowe, a nawet uruchamiać inny program.
Składnia
Instrukcja trap
ma następującą składnię:
trap [[<error type>]] {<statement list>}
Instrukcja trap
zawiera listę instrukcji do uruchomienia po wystąpieniu błędu zakończenia. Instrukcja trap
składa się ze trap
słowa kluczowego, opcjonalnie po którym następuje wyrażenie typu, oraz blok instrukcji zawierający listę instrukcji do uruchomienia po uwięzieniu błędu. Wyrażenie typu uściśli typy błędów trap
przechwytowanych.
Skrypt lub polecenie może zawierać wiele trap
instrukcji. trap
instrukcje mogą być wyświetlane w dowolnym miejscu w skrypcie lub poleceniu.
Podlewanie wszystkich błędów zakończenia
Gdy wystąpi błąd zakończenia, który nie jest obsługiwany w inny sposób w skrypsie lub poleceniu, program PowerShell sprawdza instrukcję trap
, która obsługuje błąd. trap
Jeśli instrukcja jest obecna, program PowerShell kontynuuje uruchamianie skryptu lub polecenia w instrukcji trap
.
Poniższy przykład to minimalna trap
instrukcja:
trap { 'Error found.' }
Ta trap
instrukcja wychwytuje wszelkie błędy zakończenia.
W poniższym przykładzie funkcja zawiera ciąg nonsense, który powoduje błąd środowiska uruchomieniowego.
function TrapTest {
trap { 'Error found.' }
nonsenseString
}
TrapTest
Uruchomienie tej funkcji zwraca następujące dane wyjściowe:
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.
Poniższy przykład zawiera instrukcję trap
, która wyświetla błąd przy użyciu zmiennej automatycznej $_
:
function TrapTest {
trap { "Error found: $_" }
nonsenseString
}
TrapTest
Uruchomienie tej wersji funkcji zwraca następujące dane wyjściowe:
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.
Ważne
trap
instrukcje mogą być definiowane w dowolnym miejscu w danym bloku skryptu, ale zawsze mają zastosowanie do wszystkich instrukcji w tym bloku skryptu. W czasie wykonywania trap
instrukcje w bloku są definiowane przed wykonaniem innych instrukcji.
W języku JavaScript jest to nazywane hoisting. Oznacza to, że trap
instrukcje mają zastosowanie do wszystkich instrukcji w tym bloku, nawet jeśli wykonanie nie przekroczyło punktu, w którym zostały zdefiniowane. Na przykład zdefiniowanie elementu trap
na końcu skryptu i zgłoszenie błędu w pierwszej instrukcji nadal wyzwala ten trap
element .
Błędy specyficzne dla pułapek
Skrypt lub polecenie może zawierać wiele trap
instrukcji. Można trap
zdefiniować element do obsługi określonych błędów.
Poniższy przykład to trap
instrukcja, która przechwytuje określony błąd CommandNotFoundException:
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
Gdy funkcja lub skrypt napotka ciąg, który nie jest zgodny ze znanym poleceniem, ta trap
instrukcja wyświetla Command error trapped
ciąg.
Po uruchomieniu listy instrukcji trap
program PowerShell zapisuje obiekt błędu w strumieniu błędów, a następnie kontynuuje skrypt.
Program PowerShell używa typów wyjątków platformy .NET. W poniższym przykładzie określono typ błędu System.Exception :
trap [System.Exception] { 'An error trapped' }
Typ błędu CommandNotFoundException dziedziczy z typu System.Exception . Ta instrukcja wychwytuje wszelkie błędy zgłaszane przez nieznane polecenia. Wychwytuje również inne typy błędów.
Typ wyjątku dla błędu można znaleźć, sprawdzając obiekt błędu. W poniższym przykładzie pokazano, jak uzyskać pełną nazwę wyjątku dla ostatniego błędu w sesji:
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
W skrycie może znajdować się więcej niż jedna trap
instrukcja. Tylko jedna trap
instrukcja może wychwytować każdy typ błędu. Po wystąpieniu błędu zakończenia program PowerShell wyszukuje trap
element z najbardziej określonym dopasowaniem, rozpoczynając od bieżącego bloku wykonywania skryptu.
Poniższy przykład skryptu zawiera błąd. Skrypt zawiera ogólną trap
instrukcję, która przechwytuje wszelkie błędy zakończenia i określoną trap
instrukcję określającą typ CommandNotFoundException .
trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
nonsenseString
Uruchomienie tego skryptu powoduje wygenerowanie następującego wyniku:
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.
Ponieważ program PowerShell nie rozpoznaje nonsenseString
polecenia cmdlet ani innego elementu, zwraca błąd CommandNotFoundException . Określona trap
instrukcja wychwytuje ten błąd zakończenia.
Poniższy przykład skryptu zawiera te same trap
instrukcje z innym błędem:
trap { 'Other terminating error trapped' }
trap [System.Management.Automation.CommandNotFoundException] {
'Command error trapped'
}
1/$null
Uruchomienie tego skryptu powoduje wygenerowanie następującego wyniku:
Other terminating error trapped
RuntimeException:
Line |
5 | 1/$null
| ~~~~~~~
| Attempted to divide by zero.
Próba dzielenia przez zero nie powoduje utworzenia błędu CommandNotFoundException . Druga trap
instrukcja, która wychwytuje wszelkie błędy zakończenia, wychwyci podział przez zero błędu.
Błędy uwięzienia w bloku skryptu
Domyślnie, gdy zgłaszany jest błąd zakończenia, wykonanie jest transferowane do instrukcji pułapki. Po uruchomieniu bloku kontrolka trap
powraca do następnego bloku instrukcji po lokalizacji błędu.
Na przykład w przypadku wystąpienia błędu zakończenia w foreach
instrukcji trap
instrukcja jest uruchamiana, a wykonanie będzie kontynuowane w następnej instrukcji po foreach
bloku, a nie w foreach
bloku.
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:
Line |
3 | 1/$x
| ~~~~
| Attempted to divide by zero.
after loop
W danych wyjściowych można zobaczyć, że pętle będą kontynuowane do ostatniej iteracji. Gdy skrypt próbuje podzielić wartość 1 o 0, program PowerShell zgłasza błąd zakończenia. Skrypt pomija resztę bloku skryptu foreach
, uruchamia instrukcję try
i kontynuuje działanie po bloku skryptu foreach
.
Błędy i zakres uwięzienia
Jeśli błąd zakończenia występuje w tym samym bloku skryptu trap
co instrukcja, program PowerShell uruchamia listę instrukcji zdefiniowanych przez trap
. Wykonanie jest kontynuowane w instrukcji po błędzie. trap
Jeśli instrukcja znajduje się w innym bloku skryptu od błędu, wykonanie będzie kontynuowane w następnej instrukcji, która znajduje się w tym samym bloku skryptu trap
co instrukcja .
Jeśli na przykład wystąpi błąd w funkcji, a trap
instrukcja znajduje się w funkcji, skrypt będzie kontynuowany w następnej instrukcji. Poniższy skrypt zawiera błąd i instrukcję trap
:
function function1 {
trap { 'An error: ' }
NonsenseString
'function1 was completed'
}
function1
Uruchomienie tego skryptu powoduje wygenerowanie następującego wyniku:
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
Instrukcja trap
w funkcji wychwytuje błąd. Po wyświetleniu komunikatu program PowerShell wznowi uruchomienie funkcji. Zwróć uwagę, że Function1
ukończono po instrukcji trap
.
Porównaj to zachowanie z poniższym przykładem, który ma ten sam błąd i trap
instrukcję. W tym przykładzie trap
instrukcja występuje poza funkcją:
function function2 {
NonsenseString
'function2 was completed'
}
trap { 'An error:' }
function2
Function2
Uruchomienie funkcji powoduje wygenerowanie następującego wyniku:
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.
W tym przykładzie function2 was completed
polecenie nie zostało uruchomione. W obu przykładach błąd zakończenia występuje w funkcji. W tym przykładzie instrukcja znajduje się jednak trap
poza funkcją. Program PowerShell nie wraca do funkcji po uruchomieniu instrukcji trap
.
Przestroga
Jeśli dla tego samego warunku błędu zdefiniowano wiele pułapek, jest używany pierwszy trap
zdefiniowany leksykalnie (najwyższy w bloku skryptu).
W poniższym przykładzie tylko z trap
przebiegami whoops 1
.
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }
Ważne
Instrukcja trap
jest ograniczona do miejsca, w którym jest kompilowana. Jeśli masz instrukcję trap
wewnątrz skryptu funkcji lub kropki źródłowej, po zakończeniu działania funkcji lub skryptu dot sourced wszystkie trap
instrukcje wewnątrz zostaną usunięte.
Używanie przerwania i kontynuuj słowa kluczowe
Słowa kluczowe i continue
można użyć break
w instrukcji , trap
aby określić, czy skrypt lub polecenie będzie nadal działać po błędzie zakończenia.
Jeśli dołączysz instrukcję break
trap
na liście instrukcji, program PowerShell zatrzyma funkcję lub skrypt. Następująca przykładowa funkcja używa słowa kluczowego break
trap
w instrukcji :
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.
Ponieważ instrukcja trap
zawierała break
słowo kluczowe, funkcja nie kontynuuje działania, a Function completed
wiersz nie jest uruchamiany.
W przypadku uwzględnienia słowa kluczowego continue
trap
w instrukcji program PowerShell zostanie wznowione po instrukcji, która spowodowała błąd, tak samo jak bez break
instrukcji lub continue
. Jednak za pomocą słowa kluczowego continue
program PowerShell nie zapisuje błędu w strumieniu błędów.
Następująca przykładowa funkcja używa słowa kluczowego continue
w instrukcji trap
:
function continue_example {
trap {
'Error trapped'
continue
}
1/$null
'Function completed.'
}
continue_example
Error trapped
Function completed.
Funkcja zostanie wznowiona po uwięzieniu błędu, a instrukcja zostanie uruchomiona Function completed
. Żaden błąd nie jest zapisywany w strumieniu błędów.
Uwagi
trap
instrukcje umożliwiają zapewnienie obsługi wszystkich błędów kończących w bloku skryptu. Aby uzyskać bardziej szczegółową obsługę błędów, użyj try
/catch
bloków, w których pułapki są definiowane przy użyciu catch
instrukcji . Instrukcje catch
dotyczą tylko kodu wewnątrz skojarzonej try
instrukcji. Aby uzyskać więcej informacji, zobacz about_Try_Catch_Finally.