about_Try_Catch_Finally
Krótki opis
Opisuje sposób używania try
bloków , catch
i finally
do obsługi błędów zakończenia.
Długi opis
Użyj try
, catch
i finally
bloków, aby reagować na błędy kończenie lub obsługiwać błędy zakończenia w skryptach. 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. W przypadku wystąpienia błędu try
w bloku 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 nadal wyszukuje odpowiedni catch
blok lub Trap
instrukcję w zakresach nadrzędnych. Po zakończeniu bloku lub znalezieniu catch
odpowiedniej catch
instrukcji lub Trap
bloku zostanie uruchomiona finally
. 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 służące 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 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 try
słowa kluczowe , catch
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 mieć 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 wystąpi błąd zakończenia podczas uruchamiania instrukcji na liście instrukcji, 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.
Po catch
słowie kluczowym następuje opcjonalna lista specyfikacji typów błędów i lista instrukcji. Jeśli w try
bloku wystąpi błąd zakończenia, program PowerShell wyszukuje odpowiedni catch
blok. Jeśli zostanie znalezione, instrukcje w catch
bloku zostaną wykonane.
Blok catch
może określać co najmniej jeden typ błędu. Typ błędu to wyjątek .NET Framework firmy Microsoft lub wyjątek pochodzący z wyjątku .NET Framework. Blok catch
obsługuje błędy określonej klasy wyjątku .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, blok catch
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 powoduje zatrzymanie potoku. 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, taką jak "Na koniec blok został uruchomiony", nie będzie wyświetlany po naciśnięciu klawisza CTRL+C, nawet jeśli finally
blok został uruchomiony.
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 try
lub innym catch
blokiem.
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 .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
Gdy błąd zakończenia występuje w try
bloku z zdefiniowanym Trap
w try
bloku, nawet jeśli istnieje pasujący catch
blok, Trap
instrukcja przejmuje kontrolę.
Jeśli obiekt Trap
istnieje w wyższym bloku niż try
, i nie ma pasującego catch
bloku w bieżącym zakresie, Trap
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 metody $_
, 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 następującego:
An Error occurred:
at <ScriptBlock>, <No file>: line 2
Zwalnianie zasobów przy użyciu końcu
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 skryptu lub przed wyjściem bieżącego bloku z zakresu.
Blok finally
jest uruchamiany nawet wtedy, gdy używasz klawiszy CTRL+C , aby zatrzymać skrypt. Blok finally
jest również uruchamiany, jeśli słowo kluczowe Exit zatrzymuje skrypt w bloku catch
.