Błędy powodujące przerwanie działania

W tym temacie omówiono metodę używaną do zgłaszania błędów zakończenia. Omówiono w nim również sposób wywoływania metody z poziomu polecenia cmdlet oraz omówiono wyjątki, które mogą być zwracane przez środowisko Windows PowerShell uruchomieniowe po wywołaniu metody.

Gdy wystąpi błąd zakończenia, polecenie cmdlet powinno zgłosić błąd, wywołując metodę System.Management.Automation.Cmdlet.Throwterminatingerror*. Ta metoda umożliwia polecenie cmdlet wysłanie rekordu błędu, który opisuje warunek, który spowodował błąd zakończenia. Aby uzyskać więcej informacji na temat rekordów błędów, zobacz Windows PowerShell błędów.

Po wywołaniu metody System.Management.Automation.Cmdlet.Throwterminatingerror* środowisko uruchomieniowe programu Windows PowerShell trwale zatrzymuje wykonywanie potoku i zgłasza wyjątek System.Management.Automation.Pipelinestoppedexception. Wszelkie kolejne próby wywołania system.Management.Automation.Cmdlet.WriteObject, System.Management.Automation.Cmdlet.WriteErrorlub kilku innych interfejsów API powodują, że te wywołania powodują wyjątek System.Management.Automation.Pipelinestoppedexception.

Wyjątek System.Management.Automation.Pipelinestoppedexception może również wystąpić, jeśli inne polecenie cmdlet w potoku zgłasza błąd zakończenia, jeśli użytkownik poprosił o zatrzymanie potoku lub jeśli potok został zatrzymany przed zakończeniem z jakiegokolwiek powodu. Polecenie cmdlet nie musi przechwycić wyjątku System.Management.Automation.Pipelinestoppedexception, chyba że musi wyczyścić otwarte zasoby lub jego stan wewnętrzny.

Polecenia cmdlet mogą zapisywać dowolną liczbę obiektów wyjściowych lub błędy niepowłaszające zakończenia przed zgłoszeniem błędu zakończenia. Jednak błąd zakończenia trwale zatrzymuje potok i nie można zgłaszać żadnych dalszych danych wyjściowych, błędów zakończenia ani błędów niepowiązyujących zakończenia.

Polecenia cmdlet mogą wywołać metodę System.Management.Automation.Cmdlet.Throwterminatingerror* tylko z wątku o nazwie System.Management.Automation.Cmdlet.BeginProcessing, System.Management.Automation.Cmdlet.ProcessRecord lub System.Management.Automation.Cmdlet.EndProcessing, metody przetwarzania danych wejściowych. Nie należy próbować wywołać system.Management.Automation.Cmdlet.Throwterminatingerror* ani System.Management.Automation.Cmdlet.WriteError z innego wątku. Zamiast tego błędy muszą być przekazywane z powrotem do głównego wątku.

Istnieje możliwość, aby polecenie cmdlet zgłaszało wyjątek w implementacji metody System.Management.Automation.Cmdlet.BeginProcessing, System.Management.Automation.Cmdlet.ProcessRecord lub System.Management.Automation.Cmdlet.EndProcessing. Każdy wyjątek zgłoszony przez te metody (z wyjątkiem kilku warunków poważnego błędu, które zatrzymują hosta Windows PowerShell) jest interpretowany jako błąd kończący, który zatrzymuje potok, ale nie Windows PowerShell jako całości. (Dotyczy to tylko głównego wątku polecenia cmdlet. Nieprzechowane wyjątki w wątkach zduplikowanych przez polecenie cmdlet, na ogół zatrzymywają Windows PowerShell hosta). Zalecamy użycie funkcji System.Management.Automation.Cmdlet.Throwterminatingerror* zamiast zgłaszania wyjątku, ponieważ rekord błędu zawiera dodatkowe informacje o warunku błędu, co jest przydatne dla użytkownika końcowego. Polecenia cmdlet powinny stosować się do wytycznych kodu zarządzanego przed przechwytamianiem i obsługą wszystkich wyjątków ( catch (Exception e) ). Konwertuj tylko wyjątki znanych i oczekiwanych typów na rekordy błędów.

Zobacz też

System.Management.Automation.Cmdlet.BeginProcessing

System.Management.Automation.Cmdlet.EndProcessing

System.Management.Automation.Cmdlet.ProcessRecord

System.Management.Automation.Pipelinestoppedexception

System.Management.Automation.Cmdlet.Throwterminatingerror*

System.Management.Automation.Cmdlet.WriteError

Rekordy błędów programu Windows PowerShell

Pisanie polecenia cmdlet programu Windows PowerShell