try / Catch block v PowerShell je zpracovat chyby, které jsou vytvořeny ve skriptu. Abych byl konkrétní, chyby by měly být ukončením chyb. Konečně blok v PowerShell není povinný psát pokaždé spolu s Try/Catch, ale bude proveden bez ohledu na to, zda dojde k chybě nebo ne.
takže při použití bloku Try je blok úlovku povinný, ale nakonec není blokován.
-
zkuste / Catch blok s Ukončovací chybou – níže je příklad ukončení chyby bez konečného blokování.,
Příklad:
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
Výstup
Ve výše uvedeném příkladu, musíme se vrátit něco, co není dovoleno, ale další linka byla originální, i když to nemohl provést z důvodu ukončení chyba.
Naším cílem je zachytit výjimku a chybovou zprávu generovanou v bloku Try. Jak víme, chyba je uložena v proměnné $ Error. Pokud zkontrolujete výstup proměnné $ error, můžete získat celý pohled, ale vždy, když spustíte libovolný skript a vy zpracováváte chyby, ujistěte se, že vymažete staré chyby pomocí $error.,příkaz clear () nebo použijte novou konzolu PowerShell. V případě, že znáte konkrétní umístění proměnné chyby v poli, můžete ji přímo použít. Například $error
vidíme, jaké jsou všechny vlastnosti proměnné $ 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
existuje jen málo vlastností shora, které jsou užitečné pro nalezení podrobností o výjimce a chybě. Uvidíme je a můžeme je využít i v bloku úlovků.
první vlastnost InvocationInfo., Můžete také použít chybu$, ale toto je zatím jediná chyba generovaná, takže používáme přímo chybu$, ale nemůžete získat vyskakovací okno AutoSuggestion s proměnnou $ error přímo.
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 :
můžete získat konkrétní informace z řádku a PositionMessage, jak je uvedeno níže.
zkontrolujte nyní vlastnosti výjimky.
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.
Zpráva Výjimky
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.
můžete používat i další vlastnosti, které si myslíte, že bude užitečné, aby se zobrazí chybová zpráva. Některé z nich použijeme v bloku úlovků, abychom zachytili chybu., Jak pracujeme s aktuální chybou, použijeme $_. Chcete-li se vypořádat s aktuální chybou/výjimkou.
výstup
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 jsme viděli výše, nebyl nakonec blok, ale pokus / úlovek pokračoval v práci. Můžete přidat konečně blok vymazat proměnné a chyby a zobrazit jakoukoli zprávu.
-
zkuste / Zachyťte blok s nekončící chybou.,
Jak jsme viděli ve výše uvedeném příkladu, že Ukončení chyby mohou být řízeny s Try/Catch bloku, ale Non-Ukončení chyby nemůže, protože jsou vestavěné rutiny a funkce generované chyby a výchozí preference pro Chybu akci je i Nadále, a proto další příkaz pokračovat v jízdě, i když chyba není zpracována.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
vynutit Non-Ukončení chybová ke Koncovému chyba, musíme změnit buď $ErrorActionPreference proměnné Zastavit, nebo je potřeba použít ErrorAction parametr s hodnotou., Zde použijeme parametr ErrorAction, protože jej potřebujeme pro konkrétní příkaz a ne pro celý skript.
Příklad:
Výstup
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 můžete vidět ve výše uvedeném příkladu, Get-Service produkuje non-zastavení chyba a můžeme jej převést na ukončení chyby –ErrorAction Zastavit parametr a stejným výjimkou byl chycen Bloku Catch.
-
Ruční Manipulaci Specifické Výjimky,
Pokud chcete zpracovat konkrétní typ výjimky pak můžete poskytnout název výjimky v bloku catch., Chcete-li znát název výjimky, musíte získat vlastnost proměnné $Error a je GetType(). V níže uvedeném příkladu musíme najít název výjimky z chybového výstupu níže.
Příklad:
Předpokládejme, že vaše chyba je uložena v $Chyba proměnné, musíte spustit příkaz níže, aby si výjimku název, který chcete použít v catch bloku.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
máte typ výjimky jméno příkazu výše, můžete použít stejné v catch bloku, takže blok catch chytit jen, že zvláštní výjimka.,
výstup
-
catch Multiple Exception PowerShell.
můžete také zachytit více výjimek v PowerShell. K tomu můžete použít jeden pokusný blok a více bloků úlovku.
Příklad:
Výstup
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
Tady, v první příkaz, sám chyby generované, takže další povel nechce provést. Pokud první příkaz nevytvoří žádnou chybu, bude zkontrolován další příkaz a pokud dojde k výjimce, bude proveden Catch s tímto konkrétním blokem výjimek.,
Pokud nechcete, aby zvládnout více výjimek a stále budete potřebovat pro některé příkazy chyby mohou být ignorovány, ale neměl by projít catch bloku, tak další příkaz mohl provést, pak můžete použít Ignorovat nebo SilentlyIgnore v ErrorAction Parametr.