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 również sposób wywoływania metody z poziomu polecenia cmdlet i omawia wyjątki, które mogą być zwracane przez środowisko uruchomieniowe programu Windows PowerShell podczas wywoływania metody.

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

Gdy jest wywoływana metoda 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 kilka innych interfejsów API powoduje, że te wywołania zgłaszają 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 przechwytywać 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łędów niepowodujących 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 lub błędów niepowodujących zakończenia.

Polecenia cmdlet mogą wywoływać System.Management.Automation.Cmdlet.ThrowTerminatingError* tylko z wątku o nazwie System.Management.Automation.Cmdlet.BeginProcessing, System.Management.Automation.Automation.Cmdlet.ProcessRecordlub System.Management.Automation.Cmdlet.EndProcessing metody przetwarzania danych wejściowych. Nie należy próbować wywoływać 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łosiło wyjątek w implementacji System.Management.Automation.Cmdlet.BeginProcessing, System.Management.Automation.Cmdlet.ProcessRecordlub System.Management.Automation.Cmdlet.EndProcessing. Wszelkie wyjątki zgłaszane z tych metod (z wyjątkiem kilku poważnych warunków błędu, które zatrzymają hosta programu Windows PowerShell) są interpretowane jako błąd zakończenia, który zatrzymuje potok, ale nie program Windows PowerShell jako całość. (Dotyczy to tylko głównego wątku polecenia cmdlet. Nieprzechwycone wyjątki w wątkach zduplikowanych przez polecenie cmdlet, ogólnie rzecz biorąc, zatrzymać hosta programu Windows PowerShell). Zalecamy użycie System.Management.Automation.Cmdlet.ThrowTerminatingError* zamiast zgłaszać wyjątek, ponieważ rekord błędu zawiera dodatkowe informacje o stanie błędu, co jest przydatne dla użytkownika końcowego. Polecenia cmdlet powinny przestrzegać wytycznych dotyczących kodu zarządzanego w odniesieniu do przechwytywania i obsługi 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