Udostępnij za pośrednictwem


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ącej trap. Jest to zachowanie 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 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ę using break w instrukcji trap .

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

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 skrycie 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 bardzo prosta 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 elementy:

Error found.
nonsenseString:
Line |
   3 |      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.

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 try again.
nonsenseString:
Line |
   3 |      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.

Ważne

trap instrukcje mogą być definiowane w dowolnym miejscu w danym zakresie, ale zawsze mają zastosowanie do wszystkich instrukcji w tym zakresie. 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 są zdefiniowane. Na przykład zdefiniowanie elementu trap na końcu skryptu i zgłoszenie błędu w pierwszej instrukcji nadal wyzwala ten trapelement .

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 pasuje do znanego polecenia, ta trap instrukcja 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 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 błąd tworzony przez nieznane polecenie. Wychwytuje również inne typy błędów.

W skrycie może znajdować się więcej niż jedna trap instrukcja. Każdy typ błędu może być uwięziony tylko przez jedną trap instrukcję. Po wystąpieniu błędu zakończenia program PowerShell wyszukuje trap element z najbardziej określonym dopasowaniem, zaczynając od bieżącego zakresu wykonywania.

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 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.

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ą trap instrukcję.

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 |
   4 |  1/$null
     |  ~~~~~~~
     | Attempted to divide by zero.

Próba dzielenia przez zero nie powoduje utworzenia błędu CommandNotFoundException . Zamiast tego ten błąd jest uwięziony przez drugą trap instrukcję, która wychwytuje wszelkie błędy zakończenia.

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: untitled:Untitled-1:3:4
Line |
   3 |     1/$x
     |     ~~~~
     | Attempted to divide by zero.

after loop

W powyższych danych wyjściowych można zobaczyć, że pętle będą kontynuowane do ostatniej iteracji. Gdy skrypt próbuje podzielić wartość 1 przez 0, zostanie zgłoszony błąd zakończenia. Pozostałe bloki skryptów foreach są pomijane, try instrukcja jest uruchamiana, a skrypt będzie kontynuowany po odblokowaniu skryptu foreach .

Błędy i zakres uwięzienia

Jeśli błąd zakończenia występuje w tym samym zakresie co trap instrukcja, program PowerShell uruchamia listę instrukcji zdefiniowanych przez trappolecenie . Wykonanie jest kontynuowane w instrukcji po błędzie. trap Jeśli instrukcja 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 trap 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 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.
function1 was completed

Instrukcja trap w funkcji wychwytuje 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 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 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.

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 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żywana pierwsza trap zdefiniowana leksykacyjnie (najwyższa w zakresie).

W poniższym przykładzie jest uruchamiana tylko wartość trap "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ę breaktrap na liście instrukcji, program PowerShell zatrzyma funkcję lub skrypt. Następująca przykładowa funkcja używa słowa kluczowego breaktrap 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.

trap Ponieważ instrukcja zawierała break słowo kluczowe, funkcja nie będzie nadal uruchamiana, a wiersz "Funkcja ukończona" nie jest uruchamiany.

W przypadku uwzględnienia continue słowa kluczowego trap w instrukcji 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 continuetrap 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

trap instrukcje 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.

Zobacz też