about_Try_Catch_Finally

Krótki opis

Opisuje sposób obsługi błędów tryprzerywania przy catchużyciu bloków , finally i .

Długi opis

Użyj trybloków catch, i finally , aby reagować na błędy kończące się w skryptach lub je obsługiwać. Instrukcja Trap może również służyć do obsługi błędów przerywania w skryptach. Aby uzyskać więcej informacji, zobacz about_Trap.

Błąd zakończenia zatrzymuje uruchamianie instrukcji. Jeśli program PowerShell w jakiś sposób nie obsługuje błędu zakończenia, program PowerShell zatrzymuje również uruchamianie funkcji lub skryptu przy użyciu bieżącego potoku. W innych językach, takich jak C#, błędy zakończenia są określane jako wyjątki.

Blok służy try do definiowania sekcji skryptu, w której program PowerShell ma monitorować błędy. Gdy w bloku wystąpi błąd try , jest on najpierw zapisywany w zmiennej $Error automatycznej. Program PowerShell wyszukuje blok do catch obsługi błędu. Jeśli instrukcja try nie ma pasującego catch bloku, program PowerShell catch Trap kontynuuje wyszukiwanie odpowiedniego bloku lub instrukcji w zakresach nadrzędnych. Blok zostanie catch uruchomiony po catch Trap zakończeniu działania bloku lub w przypadku, finally gdy nie zostanie znaleziony odpowiedni blok lub instrukcja. Jeśli błąd nie może zostać obsłużony, zostanie on zapisany w strumieniu błędów.

Blok catch może zawierać polecenia do śledzenia błędu lub odzyskiwania oczekiwanego przepływu skryptu. Blok catch może określać typy błędów, które przechwytuje. Instrukcja try może zawierać wiele bloków catch dla różnych rodzajów błędów.

Blok finally może służyć do wolnego zasobów, które nie są już potrzebne przez skrypt.

try, catchi przypominają finally słowa kluczowe try, catchi używane finally w języku programowania C# .

Składnia

Instrukcja try zawiera blok try , zero lub więcej catch bloków oraz zero lub jeden finally blok. Instrukcja try musi mieć co najmniej jeden catch blok lub jeden finally blok.

Poniżej przedstawiono składnię try bloku:

try {<statement list>}

Po try stwierdzeniu kluczowym następuje lista instrukcji w nawiasach klamrowych. Jeśli podczas wykonywania instrukcji na liście instrukcji wystąpi błąd zakończenia, try skrypt przekazuje obiekt błędu z bloku do odpowiedniego catch bloku.

Poniżej przedstawiono składnię catch bloku:

catch [[<error type>][',' <error type>]*] {<statement list>}

Typy błędów są wyświetlane w nawiasach kwadratowych. Najbardziej zewnętrzne nawiasy wskazują, że element jest opcjonalny.

Po catch stwierdzeniu kluczowym znajduje się opcjonalna lista specyfikacji typu błędu i lista instrukcji. Jeśli w bloku wystąpi błąd zakończenia try , program PowerShell wyszuka odpowiedni catch blok. Jeśli jedna z nich zostanie znaleziona, instrukcje w bloku catch są wykonywane.

Blok catch może określać co najmniej jeden typ błędu. Typ błędu to wyjątek .NET Framework Microsoft lub wyjątek pochodzący z .NET Framework wyjątku. Blok catch obsługuje błędy określonej .NET Framework wyjątku lub dowolnej klasy pochodzącej od określonej klasy.

Jeśli blok catch określa typ błędu, ten catch blok obsługuje ten typ błędu. Jeśli blok catch nie określa typu błędu, catch ten blok obsługuje wszelkie błędy napotkane w bloku try . Instrukcja try może zawierać wiele bloków catch dla różnych określonych typów błędów.

Poniżej przedstawiono składnię finally bloku:

finally {<statement list>}

Po finally słowie kluczowym następuje lista instrukcji, która jest uruchamiana przy każdym uruchomieniu skryptu, try nawet jeśli instrukcja została uruchomiona bez błędu lub wystąpił błąd w instrukcji catch .

Zwróć uwagę, że naciśnięcie klawisza CTRLC+ zatrzymuje potok. Obiekty wysyłane do potoku nie będą wyświetlane jako dane wyjściowe. W związku z tym, jeśli zostanie wyświetlona instrukcja , na przykład "Finally block has run" (Na koniec blok został uruchomiony), nie zostanie ona wyświetlona po naciśnięciu klawisza CTRLC+,finally nawet jeśli blok został uruchomiony.

Przechwytując błędy

Poniższy przykładowy skrypt przedstawia blok try z blokiem catch :

try { NonsenseString }
catch { "An error occurred." }

Słowo catch kluczowe musi natychmiast podążać za blokiem try lub innym blokiem catch .

Program PowerShell nie rozpoznaje elementu "NonsenseString" jako polecenia cmdlet lub innego elementu. Uruchomienie tego skryptu zwraca następujący wynik:

An error occurred.

Gdy skrypt napotka błąd "NonsenseString", powoduje to błąd powodujący zakończenie. Blok catch obsługuje błąd, uruchamiając listę instrukcji wewnątrz bloku.

Używanie wielu instrukcji catch

Instrukcja try może mieć dowolną liczbę bloków catch . Na przykład poniższy skrypt zawiera blok try MyDoc.doc, który pobiera plik i zawiera dwa bloki catch :

try {
   $wc = new-object System.Net.WebClient
   $wc.DownloadFile("http://www.contoso.com/MyDoc.doc","c:\temp\MyDoc.doc")
}
catch [System.Net.WebException],[System.IO.IOException] {
    "Unable to download MyDoc.doc from http://www.contoso.com."
}
catch {
    "An error occurred that could not be resolved."
}

Pierwszy blok catch obsługuje błędy typów System.Net.WebException i System.IO.IOException . Drugi blok catch nie określa typu błędu. Drugi blok catch obsługuje wszystkie inne występujące błędy zakończenia.

Program PowerShell dopasowuje typy błędów przez dziedziczenie. Blok catch obsługuje błędy określonej .NET Framework wyjątku lub dowolnej klasy pochodzącej od określonej klasy. Poniższy przykład zawiera blok, catch który przechwytuje błąd "Nie znaleziono polecenia":

catch [System.Management.Automation.CommandNotFoundException]
{"Inherited Exception" }

Określony typ błędu, CommandNotFoundException, dziedziczy z typu System.SystemException . Poniższy przykład przechwytuje również błąd Nie znaleziono polecenia:

catch [System.SystemException] {"Base Exception" }

Ten catch blok obsługuje błąd "Nie znaleziono polecenia" i inne błędy dziedziczące z typu SystemException .

Jeśli określisz klasę błędów i jedną z jej klas pochodnych, catch umieść blok dla klasy pochodnej przed catch blokiem dla klasy ogólnej.

Uwaga

Program PowerShell opakuje wszystkie wyjątki w typie RuntimeException . W związku z tym określenie typu błędu System.Management.Automation.RuntimeException działa tak samo jak niekwalifikowany blok catch.

Używanie pułapek w try catch

Gdy błąd zakończenia występuje w bloku try Trap try ze zdefiniowanym w bloku, catch nawet jeśli istnieje pasujący blok, Trap instrukcja przejmuje kontrolę.

Jeśli obiekt Trap istnieje w trywyższym bloku niż , catch a w bieżącym zakresie nie ma pasującego bloku, Trap obiekt przejmie kontrolę, nawet jeśli dowolny zakres nadrzędny ma pasujący catch blok.

Uzyskiwanie dostępu do informacji o wyjątkach

W bloku catch dostęp do bieżącego błędu można uzyskać za pomocą $_funkcji , która jest również znana jako $PSItem. Obiekt jest typu ErrorRecord.

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_
}

Uruchomienie tego skryptu zwraca następujący wynik:

An Error occurred:
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.

Dostępne są dodatkowe właściwości, takie jak ScriptStackTrace, Exception i ErrorDetails. Jeśli na przykład zmienimy skrypt na następujący:

try { NonsenseString }
catch {
  Write-Host "An error occurred:"
  Write-Host $_.ScriptStackTrace
}

Wynik będzie podobny do:

An Error occurred:
at <ScriptBlock>, <No file>: line 2

Freeing resources using finally (Bezpłatne zasoby przy użyciu funkcji finally)

Aby uwolnić zasoby używane przez skrypt, dodaj blok finally po blokach try i catch . finally Instrukcje bloku są uruchamiane niezależnie od tego, czy try blok napotka błąd kończący. Program PowerShell uruchamia blok finally przed zakończeniem działania skryptu lub zanim bieżący blok wykracza poza zakres.

Blok finally jest uruchamiany nawet wtedy, gdy skrypt jest zatrzymywany za pomocą klawisza CTRLC+. Blok finally jest również uruchamiany, jeśli słowo kluczowe Exit zatrzyma skrypt w obrębie catch bloku.

Zobacz też