about_Try_Catch_Finally

Krótki opis

Opisuje sposób użycia trybloków , catchi finally do obsługi błędów zakończenia.

Długi opis

Użyj trybloków , catchi finally , aby reagować na błędy zakończenia skryptów lub obsługiwać je. Instrukcję Trap można również użyć do obsługi błędów zakończenia w skryptach. Aby uzyskać więcej informacji, zobacz about_Trap.

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 przy użyciu bieżącego potoku. W innych językach, takich jak C#, błędy kończenie są określane jako wyjątki.

try Użyj bloku, aby zdefiniować sekcję skryptu, w którym program PowerShell ma monitorować błędy. Gdy w bloku wystąpi try błąd, błąd jest najpierw zapisywany w zmiennej automatycznej $Error . Następnie program PowerShell wyszukuje catch blok w celu obsługi błędu. try Jeśli instrukcja nie ma pasującego catch bloku, program PowerShell kontynuuje wyszukiwanie odpowiedniego catch bloku lub Trap instrukcji w zakresach nadrzędnych. Po zakończeniu bloku lub znalezieniu odpowiedniego catchcatch bloku lub Trap instrukcji finally zostanie uruchomiony blok. Jeśli nie można obsłużyć błędu, błąd jest zapisywany 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ć, które typy błędów przechwytuje. Instrukcja try może zawierać wiele catch bloków dla różnych rodzajów błędów.

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

try, catchi finally przypomina słowa trycatchkluczowe , i finally używane w języku programowania C#.

Składnia

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

Poniżej przedstawiono składnię try bloku:

try {<statement list>}

Po try słowie kluczowym następuje lista instrukcji w nawiasach klamrowych. Jeśli podczas uruchamiania instrukcji na liście instrukcji wystąpi błąd zakończenia, skrypt przekazuje obiekt błędu z try 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. Nawiasy zewnętrzne wskazują, że element jest opcjonalny.

Słowo catch kluczowe jest zgodne z opcjonalną listą specyfikacji typów błędów i listą instrukcji. Jeśli w try bloku wystąpi błąd zakończenia, program PowerShell wyszukuje odpowiedni catch blok. Jeśli zostanie znaleziony, instrukcje w catch bloku są wykonywane.

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

catch Jeśli blok określa typ błędu, blok catch obsługuje ten typ błędu. catch Jeśli blok nie określa typu błędu, catch blok obsługuje wszelkie błędy napotkane w try bloku. Instrukcja try może zawierać wiele catch bloków 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 uruchamiana za każdym razem, gdy skrypt jest uruchamiany, nawet jeśli try instrukcja została uruchomiona bez błędu lub wystąpił błąd w catch instrukcji.

Należy pamiętać, że naciśnięcie klawiszy CTRL+C zatrzymuje potok. Obiekty wysyłane do potoku nie będą wyświetlane jako dane wyjściowe. W związku z tym, jeśli dołączysz instrukcję do wyświetlenia, na przykład "Na koniec blok został uruchomiony", nie będzie wyświetlany po naciśnięciu klawisza CTRL+C, nawet jeśli blok został uruchomiony.finally

Przechwytywanie błędów

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

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

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

Program PowerShell nie rozpoznaje ciągu "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 błąd zakończenia. 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 następujący skrypt ma try blok, który pobiera MyDoc.docelement i zawiera dwa catch bloki:

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 catch blok obsługuje błędy typów System.Net.WebException i System.IO.IOException . Drugi catch blok nie określa typu błędu. Drugi catch blok obsługuje wszelkie inne błędy zakończenia, które występują.

Program PowerShell pasuje do typów błędów według dziedziczenia. Blok catch obsługuje błędy określonej klasy wyjątku programu .NET Framework lub dowolnej klasy pochodzącej z określonej klasy. Poniższy przykład zawiera catch blok, 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 dziedziczone z typu SystemException .

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

Uwaga

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

Używanie pułapek w try catch

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

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

Uzyskiwanie dostępu do informacji o wyjątkach

W bloku można uzyskać dostęp do bieżącego catch błędu przy użyciu $_polecenia , który jest również znany 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 następującego:

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

Zwalnianie zasobów przy użyciu na koniec

Aby zwolnić zasoby używane przez skrypt, dodaj finally blok po blokach try i catch . Instrukcje finally bloku są uruchamiane niezależnie od tego, czy try blok napotka błąd zakończenia. Program PowerShell uruchamia finally blok przed zakończeniem działania skryptu lub przed wyjściem bieżącego bloku z zakresu.

Blok finally jest uruchamiany nawet wtedy, gdy do zatrzymania skryptu jest używany klawisz CTRL+C. Blok finally jest również uruchamiany, jeśli słowo kluczowe Exit uniemożliwia wykonywanie skryptu catch w bloku.

Zobacz też