Wyjaśnij Try/Catch/Finally block w PowerShell

Try / Catch block w PowerShell ma na celu obsługę błędów występujących w skrypcie. Aby być dokładnym, błędy powinny być błędy kończące. Ostatni blok w PowerShell nie jest obowiązkowy do zapisu za każdym razem wraz z Try / Catch, ale zostanie wykonany niezależnie od błędu lub nie.

więc gdy używasz bloku Try, blok Catch jest obowiązkowy, ale nie ostatecznie blok.

  • Try/Catch block with end error − Poniżej znajduje się przykład zakończenia błędu bez finally block.,

przykład

try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}

wyjście

w powyższym przykładzie mamy zwracać coś, co nie jest dozwolone, ale następna linia była prawdziwa, chociaż nie mogła zostać wykonana z powodu błędu zakończenia.

naszym celem jest wychwycenie wyjątku i Komunikatu o błędzie wygenerowanego w bloku Try. Jak wiemy, błąd jest przechowywany w zmiennej $Error. Jeśli sprawdzisz wyjście zmiennej $ error, możesz uzyskać cały widok, ale za każdym razem, gdy uruchamiasz dowolny skrypt i obsługujesz błędy, upewnij się, że wyczyścisz stare błędy za pomocą $error.,polecenie clear() lub użyć nowej konsoli PowerShell. Jeśli znasz konkretną lokalizację zmiennej błędu w tablicy, możesz bezpośrednio z niej skorzystać. Na przykład, $error

możemy zobaczyć jakie są wszystkie właściwości zmiennej $Error.

PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty

istnieje kilka właściwości z góry są pomocne, aby znaleźć wyjątek i szczegóły błędu. Pokażemy je, a będziemy mogli wykorzystać je również w blokach.

pierwsza właściwość InvocationInfo., Możesz również użyć $Error, ale jest to jedyny błąd wygenerowany do tej pory, więc używamy bezpośrednio $ Error, ale nie można uzyskać autosuggestion Popup ze zmienną $error bezpośrednio.

PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :

możesz uzyskać szczegółowe informacje z linii i PositionMessage, jak pokazano poniżej.

Sprawdź teraz właściwości WYJĄTKÓW.

PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' 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.

komunikat wyjątku

PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' 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.

możesz użyć innych właściwości, które Twoim zdaniem będą pomocne do wyświetlenia komunikatu o błędzie. Użyjemy kilku z nich w bloku Catch, aby złapać błąd., Ponieważ pracujemy z bieżącym błędem, użyjemy $_. aby poradzić sobie z aktualnym błędem / wyjątkiem.

wyjście

Error Message: The term 'This' 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.Error in Line: This is not allowedError in Line Number: 3Error Item Name:

jak widzieliśmy powyżej, nie było ostatecznie bloku, ale Try/Catch nadal działał. Możesz dodać Finally block, aby wyczyścić zmienne i błędy oraz wyświetlić dowolną wiadomość.

  • Try/Catch block with Non-ending error.,

jak widzieliśmy w powyższym przykładzie, że błędy kończące mogą być kontrolowane za pomocą bloku Try / Catch, ale błędy nie kończące nie mogą być, ponieważ są wbudowanymi cmdletami i błędami generowanymi przez funkcje, a domyślną preferencją dla akcji o błędzie jest Continue, a zatem następne polecenie kontynuuje działanie, nawet jeśli błąd nie jest obsługiwany.

PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue

aby wymusić błąd nie kończący na błąd kończący musimy zmienić zmienną $ErrorActionPreference na Stop lub użyć parametru ErrorAction z wartością Stop., Tutaj użyjemy parametru ErrorAction, ponieważ potrzebujemy go dla konkretnego polecenia, a nie dla całego skryptu.

przykład

wyjście

Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway

Jak widać w powyższym przykładzie, Get-Service generuje błąd nie kończący się i możemy go przekonwertować na błąd kończący przez parametr-ErrorAction Stop i ten sam wyjątek został przechwycony przez blok Catch.

  • ręczna obsługa określonego wyjątku

Jeśli chcesz obsłużyć określony typ wyjątku, możesz podać nazwę wyjątku w bloku catch., Aby poznać nazwę wyjątku należy uzyskać Właściwość zmiennej $ Error I jest nią GetType (). W poniższym przykładzie musimy znaleźć nazwę wyjątku z poniższego wyjścia błędu.

przykład

Załóżmy, że twój błąd jest przechowywany w zmiennej $Error, musisz uruchomić poniższe polecenie, aby uzyskać nazwę wyjątku do użycia w bloku catch.

$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException

otrzymałeś nazwę typu wyjątku za pomocą powyższego polecenia, możesz użyć tej samej nazwy w bloku catch, aby blok catch wyłapał tylko ten konkretny wyjątek.,

wyjście

  • Przechwyć wiele wyjątków PowerShell.

Możesz także przechwytywać wiele wyjątków w PowerShell. W tym celu można użyć jednego bloku próby i wielu bloków połowu.

przykład

wyjście

Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value

tutaj, w pierwszym poleceniu, sam błąd wygenerowany, więc następne polecenie nie zostanie wykonane. Jeśli pierwsze polecenie nie wygeneruje żadnego błędu, to następne polecenie zostanie sprawdzone i jeśli wystąpi wyjątek, to Catch z tym konkretnym blokiem wyjątku zostanie wykonany.,

Jeśli nie chcesz obsługiwać wielu wyjątków i nadal potrzebujesz dla niektórych poleceń błędy mogą być ignorowane, ale nie powinieneś przechodzić przez blok catch, aby następne polecenie mogło zostać wykonane, możesz użyć Ignoruj lub milcząco w parametrze ErrorAction.

Opublikowano dnia 06-Jun-2020 16:36:12

reklamy

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Przejdź do paska narzędzi