about_Try_Catch_Finally

Krótki opis

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

Długi opis

Użyj try, catchi 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, catchi finally przypomina trysłowa kluczowe , catchi 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.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 .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 .

Zobacz też