Udostępnij za pośrednictwem


about_Trap

Krótki opis

Opisuje słowo kluczowe obsługujące 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 w przypadku wystąpienia błędu zakończenia. trap instrukcje mogą obsługiwać błędy zakończenia w następujący sposób:

  • Wyświetl błąd po przetworzeniu bloku instrukcji i kontynuowaniu trap wykonywania skryptu lub funkcji zawierającej trapelement . To zachowanie jest domyślne.

    Uwaga

    Gdy błąd zakończenia występuje w bloku skryptu podrzędnego, takim jak if instrukcja lub foreach pętla, instrukcje w trap bloku są uruchamiane i wykonywanie jest kontynuowane w następnej instrukcji poza blokiem skryptu podrzędnego.

  • Wyświetl błąd i przerwij wykonywanie skryptu lub funkcji zawierającej metodę trap using break w instrukcji trap .

  • Wycisz błąd, ale kontynuuj wykonywanie skryptu lub funkcji zawierającej trap element przy użyciu continue w instrukcji trap .

Lista instrukcji trap może zawierać wiele warunków lub wywołań funkcji. Może trap 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, gdy błąd zostanie uwięziony. Wyrażenie typu uściśli typy błędów przechwytowanych trap .

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 skrytecie 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 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 : 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 line:3 char:5
+     nonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

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 : 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 line:3 char:5
+     nonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

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 wywłaszczaniem. 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 trapelement .

Podlewanie określonych błędów

Skrypt lub polecenie może zawierać wiele trap instrukcji. Element trap można zdefiniować tak, aby obsługiwał określone błędy.

Poniższy przykład to trap instrukcja, która wychwytuje 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 do strumienia 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 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 line:1 char:1
+ nonsenseString
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

System.Management.Automation.CommandNotFoundException

Skrypt może zawierać więcej niż jedną trap instrukcję. Tylko jedna trap instrukcja może wychwytować każdy typ błędu. W przypadku wystąpienia błędu zakończenia program PowerShell wyszukuje trap element z najbardziej konkretnym dopasowaniem, zaczynając od bieżącego bloku wykonywania skryptu.

Poniższy przykładowy skrypt zawiera błąd. Skrypt zawiera ogólną trap instrukcję, która wychwyci 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 daje następujący wynik:

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 line:5 char:1
+ nonsenseString}
+ ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (nonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

Ponieważ program PowerShell nie rozpoznaje wartości "nonsenseString" jako polecenia cmdlet lub innego elementu, zwraca błąd CommandNotFoundException . trap Określona instrukcja podlewa ten błąd zakończenia.

Poniższy przykładowy skrypt 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 daje następujący wynik:

Other terminating error trapped
Attempted to divide by zero.
At line:5 char:1
+ 1/$null}
+ ~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

Próba podzielenia przez zero nie powoduje utworzenia błędu CommandNotFoundException . Druga trap instrukcja, która wychwytuje wszelkie błędy zakończenia, wychwytuje podział przez zero błędu.

Błędy podlewek w bloku skryptu

Domyślnie po wystąpieniu błędu zakończenia wykonywanie jest transferowane do instrukcji trap. 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 instrukcja jest uruchamiana, trap a wykonanie jest kontynuowane w następnej instrukcji po foreach bloku, a nie w foreach bloku.

trap { 'An error occurred!'}
foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
}
'after loop'
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
An error occurred!
Attempted to divide by zero.
At line:3 char:4
+    1/$x
+    ~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException

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 podlewek

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 daje następujący wynik:

An error:
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 line:3 char:5
+     NonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (NonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

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 daje następujący wynik:

An error:
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 line:2 char:5
+     NonsenseString
+     ~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (NonsenseString:String) []
   , CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

W tym przykładzie function2 was completed polecenie nie zostało uruchomione. W obu przykładach w funkcji występuje błąd zakończenia. W tym przykładzie instrukcja znajduje się jednak trap poza funkcją . Program PowerShell nie wraca do funkcji po uruchomieniu instrukcji trap .

Uwaga

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 trap z przebiegami whoops 1 .

Remove-Item -ErrorAction Stop ThisFileDoesNotExist
trap { 'whoops 1'; continue }
trap { 'whoops 2'; continue }

Ważne

Instrukcja trap jest ograniczona do lokalizacji, w której jest kompilowana. Jeśli masz instrukcję trap wewnątrz funkcji lub skryptu dot sourced, po zakończeniu działania funkcji lub kropki źródłowej skryptu 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 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:6 char:5
+     1/$null
+     ~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], ParentContainsErrorR
   ecordException
    + FullyQualifiedErrorId : RuntimeException

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 w przypadku polecenia break 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 ContinueExample {
    trap {
        'Error trapped'
        continue
    }
    foreach ($x in 3..-1) {
       "1/$x = "
       "`t$(1/$x)"
    }
    'End of function'
}

ContinueExample
1/3 =
        0.333333333333333
1/2 =
        0.5
1/1 =
        1
1/0 =
Error trapped
End of function

Funkcja jest wznawiana po uwięzieniu błędu, a End of function instrukcja jest uruchamiana. Żaden błąd nie jest zapisywany w strumieniu błędów.

Uwagi

trap instrukcje umożliwiają zapewnienie obsługi wszystkich błędów zakończenia w bloku skryptu. Aby uzyskać bardziej szczegółową obsługę błędów, należy użyć 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.

Zobacz też