about_Try_Catch_Finally
Krótki opis
Opisuje sposób użycia try
bloków , catch
i finally
do obsługi błędów zakończenia.
Długi opis
Użyj try
bloków , catch
i 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 catch
catch
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
, catch
i finally
przypomina słowa try
catch
kluczowe , 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 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 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.doc
element 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ż try
blok , 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 CTRL+C. Blok finally
jest również uruchamiany, jeśli słowo kluczowe Exit uniemożliwia wykonywanie skryptu catch
w bloku.