Informacje o pułapce
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. Instrukcje pułapki obsługują błędy zakończenia i umożliwiają wykonywanie skryptu lub funkcji w celu kontynuowania zamiast zatrzymywania.
Instrukcje pułapki mogą być również bardziej złożone. Lista instrukcji pułapki może zawierać wiele warunków lub wywołań funkcji. Pułapka 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 przechwytuje pułapki.
Skrypt lub polecenie może zawierać wiele instrukcji Trap. Instrukcje pułapki 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 skrypie lub poleceniu, program PowerShell sprawdza instrukcję Trap, która obsługuje błąd. Jeśli instrukcja Trap jest obecna, program PowerShell kontynuuje uruchamianie skryptu lub polecenia w instrukcji Trap.
Poniższy przykład to bardzo prosta instrukcja Trap:
trap {"Error found."}
Ta instrukcja Trap obejmuje 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 elementy:
Error found.
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 elementy:
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.
Ważne
Instrukcje pułapki mogą być definiowane w dowolnym miejscu w danym zakresie, ale zawsze mają zastosowanie do wszystkich instrukcji w tym zakresie. W czasie wykonywania pułapki w bloku są definiowane przed wykonaniem innych instrukcji. W języku JavaScript jest to nazywane hoisting. Oznacza to, że pułapki mają zastosowanie do wszystkich instrukcji w tym bloku, nawet jeśli wykonanie nie przekroczyło punktu, w którym są zdefiniowane. Na przykład zdefiniowanie pułapki na końcu skryptu i zgłoszenie błędu w pierwszej instrukcji nadal wyzwala pułapkę.
Błędy specyficzne dla pułapek
Skrypt lub polecenie może zawierać wiele instrukcji Trap. Pułapki można zdefiniować w celu obsługi określonych błędów.
Poniższy przykład to instrukcja Trap, 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 pasuje do znanego polecenia, ta instrukcja Trap wyświetla ciąg "Błąd polecenia uwięziony". 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 .NET Framework firmy Microsoft. 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 błąd tworzony przez nieznane polecenie. Wychwytuje również inne typy błędów.
W skrycie może znajdować się więcej niż jedna instrukcja Trap. Każdy typ błędu może być uwięziony tylko przez jedną instrukcję Trap. Po wystąpieniu błędu zakończenia program PowerShell wyszukuje pułapkę z najbardziej określonym dopasowaniem, zaczynając od bieżącego zakresu wykonywania.
Poniższy przykład skryptu zawiera błąd. Skrypt zawiera ogólną instrukcję Trap, 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 : 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
Ponieważ program PowerShell nie rozpoznaje "nonsenseString" jako polecenia cmdlet lub innego elementu, zwraca błąd CommandNotFoundException . Ten błąd zakończenia jest uwięziony przez konkretną instrukcję Trap.
Poniższy przykładowy skrypt zawiera te same instrukcje Trap 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
Attempted to divide by zero.
At C:\temp\test\traptest.ps1:5 char:1
+ 1/$null
+ ~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Próba dzielenia przez zero nie powoduje utworzenia błędu CommandNotFoundException . Zamiast tego ten błąd jest uwięziony przez inną instrukcję Trap, która wychwyci wszelkie błędy zakończenia.
Błędy i zakres uwięzienia
Jeśli błąd zakończenia występuje w tym samym zakresie co instrukcja Trap, program PowerShell uruchamia listę instrukcji zdefiniowanych przez pułapkę. Wykonanie jest kontynuowane w instrukcji po błędzie. Jeśli instrukcja Trap znajduje się w innym zakresie niż błąd, wykonanie będzie kontynuowane w następnej instrukcji, która znajduje się w tym samym zakresie co instrukcja Trap.
Jeśli na przykład wystąpi błąd w funkcji, a instrukcja Trap znajduje się w funkcji, skrypt będzie kontynuowany w następnej instrukcji. Poniższy skrypt zawiera błąd i instrukcję pułapki:
function function1 {
trap { "An error: " }
NonsenseString
"function1 was completed"
}
W dalszej części skryptu uruchomienie funkcji Function1 daje następujący wynik:
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
Instrukcja Trap w funkcji wychwyci błąd. Po wyświetleniu komunikatu program PowerShell wznowi uruchomienie funkcji. Należy pamiętać, że Function1
zostało to ukończone.
Porównaj to z poniższym przykładem, który ma ten sam błąd i Trap
instrukcję. W tym przykładzie instrukcja pułapki 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:
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 <<<<
W tym przykładzie polecenie "function2 zostało ukończone" nie zostało uruchomione. W obu przykładach błąd zakończenia występuje w funkcji. W tym przykładzie instrukcja Trap znajduje się jednak 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, używana jest pierwsza pułapka zdefiniowana leksycznie (najwyższa w zakresie).
W poniższym przykładzie jest uruchamiana tylko pułapka z "whoops 1".
Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { "whoops 1"; continue }
trap { "whoops 2"; continue }
break
Używanie słów kluczowych i continue
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
na liście instrukcji Trap, program PowerShell zatrzyma funkcję lub skrypt. Następująca przykładowa funkcja używa słowa kluczowego Break
w instrukcji 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
Ponieważ instrukcja Trap zawierała Break
słowo kluczowe, funkcja nie będzie nadal uruchamiana, a wiersz "Funkcja ukończona" nie jest uruchamiany.
Jeśli dołączysz instrukcję Continue
w instrukcji Trap, program PowerShell zostanie wznowione po instrukcji, która spowodowała błąd, tak samo jak bez Break
instrukcji lub Continue
. Jednak przy użyciu 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
Trap
w instrukcji :
function continue_example {
trap {
"Error trapped"
continue
}
1/$null
"Function completed."
}
continue_example
Error trapped
Function completed.
Funkcja jest wznawiana po uwięzieniu błędu, a instrukcja "Function completed" jest uruchamiana. Żaden błąd nie jest zapisywany w strumieniu błędów.
Uwagi
Instrukcje pułapki zapewniają prosty sposób, aby zapewnić obsługę wszystkich błędów kończących w zakresie. 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.