Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Krótki opis
Opisuje sposób użycia bloków try, catchi finally do obsługi błędów zakończenia.
Długi opis
Użyj bloków try, 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.
Użyj bloku try, aby zdefiniować sekcję skryptu, w którym program PowerShell ma monitorować błędy. W przypadku wystąpienia błędu w bloku try błąd jest najpierw zapisywany w zmiennej automatycznej $Error. Następnie program PowerShell wyszukuje blok catch w celu obsługi błędu. Jeśli instrukcja try nie ma pasującego bloku catch, program PowerShell nadal wyszukuje odpowiedni blok catch lub instrukcję trap w zakresach nadrzędnych. Po zakończeniu bloku catch lub znalezieniu odpowiedniej instrukcji catch lub instrukcji trap zostanie uruchomiony blok 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 przechwytujących. 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 zwalniania wszystkich zasobów, które nie są już potrzebne przez skrypt.
try, catchi finally przypominają słowa kluczowe try, catchi finally używane w języku programowania C#.
Składnia
Instrukcja try zawiera blok try, zero lub więcej bloków catch oraz zero lub jeden blok finally. Instrukcja try musi zawierać co najmniej jeden blok catch lub jeden blok finally.
Poniżej przedstawiono składnię try bloku:
try {<statement list>}
Słowo kluczowe try następuje po liście 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 bloku try do odpowiedniego bloku catch.
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 kluczowe catch następuje opcjonalna lista specyfikacji typów błędów i lista instrukcji. Jeśli w bloku try wystąpi błąd zakończenia, program PowerShell wyszukuje odpowiedni blok catch. Jeśli zostanie znaleziony, instrukcje w bloku catch 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.
Jeśli blok catch określa typ błędu, catch blok obsługuje ten typ błędu. Jeśli blok catch nie określa typu błędu, blok catch 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 słowie kluczowym finally następuje lista instrukcji uruchamiana za każdym razem, gdy skrypt jest uruchamiany, nawet jeśli instrukcja try została uruchomiona bez błędu lub wystąpił błąd w instrukcji catch.
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 on wyświetlany po naciśnięciu CTRL+C, nawet jeśli blok finally został uruchomiony.
Przechwytywanie błędów
Poniższy przykładowy skrypt przedstawia blok try z blokiem catch:
try { NonsenseString }
catch { "An error occurred." }
Słowo kluczowe catch musi natychmiast podążać za blokiem try lub innym blokiem catch.
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 blok try, który pobiera MyDoc.doci zawiera dwa bloki catch:
try {
$wc = New-Object System.Net.WebClient
$wc.DownloadFile("https://httpbin.org/MyDoc.doc","C:\temp\MyDoc.doc")
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} 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 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 blok catch, który przechwytuje błąd "Nie znaleziono polecenia":
catch [System.Management.Automation.CommandNotFoundException] {
"Inherited Exception"
}
Określony typ błędu CommandNotFoundExceptiondziedziczy z typu System.SystemException. Poniższy przykład przechwytuje również błąd Nie znaleziono polecenia:
catch [System.SystemException] {"Base Exception" }
Ten catch bloku 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ść blok catch dla klasy pochodnej przed blokiem catch dla klasy ogólnej.
Nuta
Program PowerShell opakowuje wszystkie wyjątki w typie RuntimeException. Dlatego określenie typu błędu System.Management.Automation.RuntimeException zachowuje się tak samo jak niekwalifikowany blok połowu.
Używanie pułapek w try catch
W przypadku wystąpienia błędu zakończenia w bloku try z trap zdefiniowanym w bloku try, nawet jeśli istnieje pasujący blok catch, instrukcja trap przejmuje kontrolę.
Jeśli trap istnieje w wyższym bloku niż tryi nie ma pasującego bloku catch w bieżącym zakresie, trap przejmie kontrolę, nawet jeśli jakikolwiek zakres nadrzędny ma pasujący blok catch.
Uzyskiwanie dostępu do informacji o wyjątkach
catch W bloku można uzyskać dostęp do bieżącego błędu przy użyciu zmiennej $_ lub $PSItem automatycznej. 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, Exceptioni 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 blok finally po blokach try i catch. Instrukcje finally bloku są uruchamiane niezależnie od tego, czy blok try napotka błąd zakończenia. Program PowerShell uruchamia blok finally przed zakończeniem działania skryptu lub przed wyjściem bieżącego bloku z zakresu.
Blok finally jest uruchamiany, nawet jeśli do zatrzymania skryptu jest używany ctrl+C. Blok finally jest również uruchamiany, jeśli słowo kluczowe exit zatrzymuje skrypt w bloku catch.
W poniższym przykładzie blok try próbuje pobrać plik do folderu C:\temp. Bloki catch obsługują błędy występujące podczas pobierania. Blok finally usuwa obiekt WebClient i usuwa plik tymczasowy, jeśli istnieje.
try {
$wc = New-Object System.Net.WebClient
$tempFile = "C:\temp\MyDoc.doc"
$wc.DownloadFile("https://httpbin.org/MyDoc.doc",$tempFile)
} catch [System.Net.WebException],[System.IO.IOException] {
"Unable to download MyDoc.doc from https://httpbin.org."
} catch {
"An error occurred that could not be resolved."
} finally {
$wc.Dispose()
if (Test-Path $tempPath) { Remove-Item $tempFile }
}